Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Блокнот != среда разработки. Он подойдет полько для пхп и похожих скриптовых языковЗря Вы так, уважаемый kick. Основы знать все же надо.
А "ссаные сайтики" на php в блокноте пишутся на ура, и часто работают они не хуже, а иногда и лучше созданных в навороченных редакторах. Все зависит от "пряморукости" программиста.
пральна ))) согласен на все стоВыбирай то говно, которое ты сможешь съесть, а не то, которое нравится есть другим.
Ну да именно старые и без применения паттерна MVC. То то я смотрю любой разработчик пишет в среде разработки и пишет под неё различные плагины и не только. Так же приведу простой пример XF пишут в среде PhP Storm и есть генерация мета файлов, а теперь возьмем их уровень и несколько лет написания написания приложений на пхп. Они пишут на пхп уже столько лет, что больше лет чем пользователям шмакси. Тот же ларавел так же имеет генерацию под PhP Storm. Написание реального и хорошего веб приложения, без среды разработки не возможна по многим причинам. Ну а кто пытается, что то кричать подобное, либо познают азы программирования или говнокодеры которые не работали над серьезным проектом и в команде. Угадаю как минимум приложения ещё и тестами не покрывается. Так что кодинг в блокнотике это клиника и реальные PhP приложения не пишутся ни кем в блокноте.Зря Вы так, уважаемый kick. Основы знать все же надо.
А "ссаные сайтики" на php в блокноте пишутся на ура, и часто работают они не хуже, а иногда и лучше созданных в навороченных редакторах. Все зависит от "пряморукости" программиста.
package main
import (
"encoding/json"
"fmt"
"net/http"
"time"
"github.com/360EntSecGroup-Skylar/excelize"
)
type list struct {
COUNT int `json:"count"`
NEXT string `json:"next"`
BACK string `json:"previous"`
RES []results `json:"results"`
}
type results struct {
ID int `json:"id"`
SLUG string `json:"slug"`
TITLE string `json:"title"`
}
type FullViews struct {
TEXT string `json:"body_text"`
DESC string `json:"description"`
TITLE string `json:"title"`
URL string `json:"site_url"`
PL place `json:"place"`
DATE []dates `json:"dates"`
}
type place struct {
ID int32 `json:"id"`
}
type Maps struct {
ADRES string `json:"address"`
}
type dates struct {
START int64 `json:"start"`
END int64 `json:"end"`
}
var xls = excelize.NewFile()
func main() {
var time = int32(time.Now().Unix())
index := xls.NewSheet("Отчет")
xls.SetCellValue("Отчет", "A1", "Заголовок")
xls.SetCellValue("Отчет", "B1", "Описание")
xls.SetCellValue("Отчет", "C1", "Сылка")
xls.SetCellValue("Отчет", "D1", "Дата")
xls.SetCellValue("Отчет", "E1", "Место")
for page := 1; page < 15; page++ {
forResult(time, page)
}
xls.SetActiveSheet(index)
xls.SaveAs("./" + fmt.Sprintf("%d", time) + ".xlsx")
}
func forResult(t int32, page int) {
var Data = &list{}
var Views = &FullViews{}
var place = &Maps{}
var s int = 2
var D = t + 86400
var M = t + 2592000
err := getJSON(fmt.Sprintf("https://kudago.com/public-api/v1.4/events/?location=msk&text_format=text&page_size=100&actual_since=%d&page=%d&actual_until=%d", D, page, M), Data)
if err != nil {
fmt.Println("Ошибка доступа к API")
}
for i := range Data.RES {
fmt.Printf("ID%d - %s\n", Data.RES[i].ID, Data.RES[i].TITLE)
err := getJSON("https://kudago.com/public-api/v1.4/events/"+fmt.Sprintf("%d", Data.RES[i].ID)+"/?lang=&fields=&text_format=text", Views)
if err != nil {
fmt.Println("Ошибка доступа к API")
}
getJSON("https://kudago.com/public-api/v1.4/places/"+fmt.Sprintf("%d", Views.PL.ID)+"/?lang=ru", place)
if err != nil {
fmt.Println("Ошибка доступа к API")
}
dates := time.Unix(Views.DATE[0].START, 0)
xls.SetCellValue("Отчет", fmt.Sprintf("A%d", s), Views.TITLE)
xls.SetCellValue("Отчет", fmt.Sprintf("B%d", s), Views.TEXT)
xls.SetCellValue("Отчет", fmt.Sprintf("C%d", s), Views.URL)
xls.SetCellValue("Отчет", fmt.Sprintf("D%d", s), dates)
xls.SetCellValue("Отчет", fmt.Sprintf("E%d", s), place.ADRES)
s++
}
}
func getJSON(url string, target interface{}) error {
r, err := http.Get(url)
if err != nil {
return err
}
defer r.Body.Close()
return json.NewDecoder(r.Body).Decode(&target)
}
<?php
namespace lib;
class Brouwse
{
private static $login;
private static $password;
private static $siteCode;
private static $API_KEY;
private static $youbit;
public static $wallID = ['rub' => 50003, 'usd' => 50001];
public static $TempCaptcha;
public static $support;
public static $Check = false;
public static $SRF_TEMP = false;
/**
* __construct
*
* @param string $login
* @param string $password
* @param float $support
* @param string $API_KEY
* @param string $siteCode
*/
public function __construct(string $login, string $password, float $support, string $API_KEY, string $siteCode)
{
self::$login = $login;
self::$password = $password;
self::$youbit = __DIR__ . "/coockie/{$login}";
self::$SRF_TEMP = __DIR__ ."/coockie/srf";
self::$API_KEY = $API_KEY;
self::$siteCode = $siteCode;
if (!file_exists(self::$youbit)) {
file_put_contents(self::$youbit, '');
}
self::$support = $support;
}
/**
* getSRF function get srf token site
*
* @param boolean $k
* @return void
*/
public static function getSRF($k = false)
{
if ($k) {
$url = Brouwse::getURL('https://yobit.net/ru/', [], 'GET');
\preg_match('/csrf_token\"\svalue\=\"(.*?)\"/i', $url, $match);
if (isset($match[1]) && !empty($match[1])) {
return file_put_contents(self::$SRF_TEMP, $match[1]);
}
self::$Check = true;
return Brouwse::login();
/***
if (!isset($match[1])) {
Telega::msg(Route::$data->chat, Lang::$get->text->ErrorYoubitUser);
throw new \Exception("Error Login Youbit");
}
*/
}
return trim(file_get_contents(self::$SRF_TEMP));
}
/**
* genCode function generate code cupoun
*
* @param float $summ
* @param string $currency
* @return void
*/
public static function genCode(float $summ, string $currency)
{
$cur = ['rub' => 'RUR', 'usd' => 'USD'];
$param = [
"method" => "new_yobicode",
"csrf_token" => Brouwse::getSRF(),
"currency" => self::$wallID[$currency],
"amount" => $summ
];
$result = Brouwse::getURL('https://yobit.net/ajax/system_yobicodes.php', \http_build_query($param), 'POST', true);
if (isset($result->error, $result->result) && $result->error == 0 && $result->result == 'OK') {
return Brouwse::getAllCode($summ, $cur[$currency]);
}
}
/**
* getAllCode function get all code cupoun
*
* @param [type] $summ
* @param [type] $cur
* @return void
*/
private static function getAllCode($summ, $cur)
{
$param = [
"draw" => 1,
"columns[0][data]" => 0,
"columns[0][name]" => "",
"columns[0][searchable]" => true,
"columns[0][orderable]" => false,
"columns[0][search][value]" => "",
"columns[0][search][regex]" => false,
"columns[1][data]" => 1,
"columns[1][name]" => "",
"columns[1][searchable]" => true,
"columns[1][orderable]" => false,
"columns[1][search][value]" => "",
"columns[1][search][regex]" => false,
"columns[2][data]" => 2,
"columns[2][name]" => "",
"columns[2][searchable]" => true,
"columns[2][orderable]" => false,
"columns[2][search][value]" => "",
"columns[2][search][regex]" => false,
"start" => 0,
"length" => 20,
"search[value]" => "",
"search[regex]" => false,
"method" => "get_yobicodes_list",
"csrf_token" => Brouwse::getSRF()
];
$result = Brouwse::getURL('https://yobit.net/ajax/system_yobicodes.php', \http_build_query($param), 'POST', true);
if ($result->data) {
foreach ($result->data as $k => $v) {
if (preg_match('/green/i', $v[2]) && (float)$v[1] == $summ) {
if (preg_match("/YOBIT(.*)$cur/i", $v[0], $match)) {
return $match[0];
}
}
}
}
return false;
}
/**
* checkCode function checking and activete code cupoun
*
* @param [type] $code
* @param [type] $currency
* @return void
*/
public static function checkCode($code, $currency)
{
$cur = ['rub' => 'RUR', 'usd' => 'USD'];
$param = [
"method" => "activate_yobicode",
"csrf_token" => Brouwse::getSRF(),
"code" => $code,
"captcha" => Brouwse::ruCaptcha('https://yobit.net/ru/yobicodes/')
];
$result = Brouwse::getURL('https://yobit.net/ajax/system_yobicodes.php', \http_build_query($param), 'POST', true);
\file_put_contents('log', \json_encode($result));
if (isset($result->error_log)) {
switch ($result->error_log) {
case 'Invalid captcha':
Brouwse::errorCaptcha();
return Lang::$get->text->ErrorYoubit;
break;
case 'invalid csrf token':
Brouwse::errorCaptcha();
return Lang::$get->text->ErrorYoubit;
break;
}
if (\preg_match('/Yobit/i', $result->error_log)) {
return $result->error_log;
}
}
if (isset($result->result, $result->error) && $result->error == 0 && $result->result == 'OK') {
\preg_match('/(\d{0,9}\.\d{0,9})/i', $result->log, $sum);
if (\preg_match("/{$cur[$currency]}/i", $result->log) && (float)$sum[1] > 0) {
return number_format($sum[1], 2, '.', '');
}
}
return Lang::$get->text->ErrorYoubit;
}
/**
* login function auth login:password site
*
* @param boolean $codeMail
* @return void
*/
public static function login($codeMail = false)
{
$param = [
"method" => "login",
"locale" => "ru",
"email" => self::$login,
"psw" => self::$password,
"remember" => 1,
"code_2fa" => "",
"code_email" => ($codeMail) ? strtoupper(trim($codeMail)) : "",
"captcha" => Brouwse::ruCaptcha('https://yobit.net/ru/'),
"tz" => "Asia/Baghdad",
'scrw' => 1920,
"scrh" => 1080,
];
$result = Brouwse::getURL('https://yobit.net/ajax/system_login.php', \http_build_query($param), 'POST', true);
if (isset($result->result) && $result->result == 'OK' && !self::$Check) {
return Telega::msg(self::$support, Lang::$get->text->accountSussecc);
}
if (isset($result->error_log) && @$result->need_email_code == 1) {
return \lib\Telega::msg(self::$support, "Нарушена авторизация на сайте Youbit, он выслал вам код на email\nДля отпавки кода введи:\n/youbit-xxx - где xxx код с почты");
}
if (isset($result->error_log) && $result->error_log == 'Invalid captcha') {
Brouwse::errorCaptcha();
}
return \lib\Telega::msg(self::$support, "Что то пошло не так попробуйте еще раз\nНарушена авторизация на сайте Youbit, он выслал вам код на email\nДля отпавки кода введи:\n/youbit-xxx - где xxx код с почты");
}
/**
* errorCaptcha function
*
* @return void
*/
private static function errorCaptcha()
{
$params = [
"key" => self::$API_KEY,
"action" => "reportbad",
"id" => self::$TempCaptcha,
"json" => 1
];
file_get_contents("http://rucaptcha.com/res.php?" . http_build_query($params));
return true;
}
/**
* ruCaptcha function
*
* @param [type] $url
* @return void
*/
private static function ruCaptcha($url)
{
$param = [
"key" => self::$API_KEY,
"method" => "userrecaptcha",
"googlekey" => self::$siteCode,
"pageurl" => $url,
"json" => 1
];
$result = json_decode(\file_get_contents('http://rucaptcha.com/in.php?' . http_build_query($param)));
if ($result->status == 1) {
self::$TempCaptcha = $result->request;
$sleep = 30;
while ($sleep) {
\sleep($sleep);
$params = [
"key" => self::$API_KEY,
"action" => "get",
"id" => $result->request,
"json" => 1
];
$key = json_decode(\file_get_contents("http://rucaptcha.com/res.php?" . http_build_query($params)));
if ($key->status == 1) {
return $key->request;
continue;
}
$sleep -= 5;
}
}
return false;
}
/**
* getURL function CURL
*
* @param [type] $url
* @param [type] $params
* @param string $type
* @param boolean $json
* @return void
*/
public static function getURL($url, $params, $type = 'POST', $json = false)
{
$ch = curl_init();
if ($type == 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_URL, $url);
}
if ($type == 'GET') {
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($params));
}
curl_setopt($ch, CURLOPT_COOKIEFILE, self::$youbit);
curl_setopt($ch, CURLOPT_COOKIEJAR, self::$youbit);
curl_setopt($ch, CURLOPT_COOKIEFILE, self::$youbit);
curl_setopt_array($ch, array(
CURLOPT_HTTPHEADER => [
'accept-language: ru',
'authority: yobit.net',
'scheme: https',
'dnt: 1',
'origin: https://yobit.net',
'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_VERBOSE => false
));
if ($json) {
$result = json_decode(curl_exec($ch));
} else {
$result = curl_exec($ch);
}
curl_close($ch);
return $result;
}
}
Забыли автора указать...для новичков Spring — это хороший костыль для освоения таких идей, как внедрение зависимостей, mocking и тестирование, но на самом деле они ортогональны Spring. Если вы применяете TDD, у вас в коде не будет геттеров и сеттеров — только внедрение зависимостей через конструкторы, которые вы можете «замокать» для тестирования, а затем, когда вы связываете своё приложение воедино, просто используете часто забываемый способ создания объектов — ключевое слово «new». Зачастую мы создаем класс «ApplicationContext», который отвечает за связывание всего воедино
asm/C++ и ничего другого.
Ну отрефакторить много надо)@verbrannt а что тебя в моем говно коде так рассмешило? Мне кажется он не на столько уж ужасен.
я этот бред писал года 2 назад так что там ничего рефакторить ненужно, он свое отработал))Ну отрефакторить много надо)
Вообще с хостингом это отдельный вопрос, т.к. большинство платных хостинов кричат что они друпал френдли, а на самом деле его там можно установить и не трогать, о человеческом деплое и речь идти не можетRovskoi, Ну да фреймворк для фреймворк и даже запуск для фреймворка... Есть спец языки для сайтов, а не извращения. Ну да для абстракции есть кучу нормальных фреймов, библиотек. Помимо этого шаред хостинг не сможет обеспечить необходимый функционал и не позволит запустить. Я то смотрю не в 1 эмуле досих пор нет ORM и пример как не нужно кодить. Спринг априори кроме круд ничего не может дать, как и нормальной ORM
Отрефакторить != Не работает)я этот бред писал года 2 назад так что там ничего рефакторить ненужно, он свое отработал))
@verbrannt а что тебя в моем говно коде так рассмешило? Мне кажется он не на столько уж ужасен.
Что такое выгоднее?что будет выгодней изучать?
php - хз чо про него сказать
js - ну это огород
golang - тут надо подумать Си будет получше мне кажется
Java - ?
python - ?
вообщем я запутался с выбором.
в планах - писать серверные, сетевые,(web), всякие обработчики ну и тд.
ээээ...Не понял логику. Почему в цикле обращаемся к пакету fmt, а в статусе GET запроса через встроенную println ?)C:#Перебор массива for i, v := range x { fmt.Println(i, v) } #Отправка запроса r, _ := http.Get(urlStr) println(r.Status)
package main
import (
"fmt"
"net/http"
)
func main() {
x := [...]string{"Logan22", "Volond lox", "Ahmed poc"}
for i, v := range x {
fmt.Println(i, v)
}
resp, err := http.Get("https://golang.org")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
fmt.Println(resp.Status)
}