Сообщество - Программирование на PHP

Программирование на PHP

43 поста 1 561 подписчик
25

Как подружить Ежа с Ужом или отправить с сайта заявку в 1С

Наступил час Х, директор вызвал меня и объявил, что хочет, что бы заказы с сайта падали в 1С. Деваться некуда пришлось браться за столь весёлую и увлекательную задачу. Так как 1С я видел только из далека на компьютере главного бухгалтера, первая моя мысль была поймать нашего 1С-ника работающего на удалёнке и объяснить ему задачу. Поймал, объяснил, что хочу мол в 1С POST запросы отправлять для формирования заявки. 1Сник очень удивился, сказал: "Моя твоя не понимать", но обещал подумать. Через пару часов позвонил и сказал, что в 1С есть уже готовая система для приёма заявок с сайта. Но как она работает он не знает, так что разбирайся сам. Приехали.


Что делать, пришлось сесть и читать про CommerceML 2. При первом знакомстве с документацией на сайте 1С, чтение сего мануала вызывало боль, отвращение и мысли о суициде. Такой охуенной документации я давно не читал. После первого прочтения решил позвонить в одну известную в нашем городе 1С контору и спросить, сколько будет стоить сопряжение нашего сайта с 1С, менеджеры долго совещались и через сутки вынесли вердикт 30 000 рублей.


Ох уж эти 1С-ники, им только денег дай. Можно было конечно у директора попросить денег, он бы дал, но тут видимо во мне взыграли амбиции и решил я таки разобраться сам.


Первое, что было необходимо сделать это поднять web сервер на сервере 1С и настроить 1С-ку что бы она общалась через этот web сервер, надо отдать должное описание сего процесса есть на многих сайтах и форумах и занимает не более получаса.


А что дальше? Проверяем как работает веб сервер и отправляем ему запрос в браузере:


http://xxx.xxx.xxx.xxx/'Имя сервиса'/ws/SiteExchange?wsdl


Получаем XML-ную партянку, охуеваем и от количества параметров. Где наша не пропадала? Лезем читать мануалы и тут нас ждёт горькое разочарование. Нет никакой информации, какие параметры обязательны для отправления, как будет привязываться товар  к справочнику номеклатуры. Как это всё работает в целом?


Попытки отправить XML запрос вызывали ошибки на стороне 1С, она ругалась не понятными словами. А дальше пару дней я просто читал всё что связанно с оформлением заявок с сайта в 1С.


Ничего дельного я не нашёл. Но пару раз меня выкидывало на форум 1С, но там нужна была регистрация, а регистрироваться в этой богадельне мне не хотелось, но на конец второго дня я понял, что видимо придётся. Регистрация давалась на 7 дней, если ты не являешься клиентом ))).


Регистрация пройдена и о чудо в одной из веток я обнаружил обсуждение данного вопроса и там то я и подсмотрел как правильно формировать XML запрос.


Выкладываю его сюда может ещё кому пригодится:


function Connect1C(){

if (!function_exists('is_soap_fault')){

print 'Не настроен web сервер. Не найден модуль php-soap.';

return false;

}

try {

$client1C = new SoapClient('http://xxx.xxx.xxx.xxx/'Имя веб-сервиса'/ws/SiteExchange?wsdl',

array('login' => 'woodman02',

'password' => 'password',

'soap_version' => SOAP_1_2,

'cache_wsdl' => WSDL_CACHE_NONE, //WSDL_CACHE_MEMORY, //, WSDL_CACHE_NONE, WSDL_CACHE_DISK or WSDL_CACHE_BOTH

'exceptions' => true,

'trace' => 1));

}catch(SoapFault $e) {

trigger_error('Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.', E_ERROR);

}

if (is_soap_fault($client1C)){

trigger_error('Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.', E_ERROR);

return false;

}

return client1C;

}

function GetData($idc, $param){

if (is_object($idc)){

try {

$ret1c = $idc->LoadOrders($param);

} catch (SoapFault $e) {

echo "Ошибка</br>";

var_dump($e);

var_dump($ret1c);

}

}

else{

echo 'Не удалось подключиться к 1С<br>';

}

return $ret1c;

}

$OrdersData = Array(

"ВерсияСхемы" => "2.05",

"ДатаФормирования" => "2020-05-29T11:56:10",

"Документ" => Array(

"Ид" => null,

"Номер" => null,

"Дата" => "2020-05-29",

"ХозОперация" => "ЗаказНаПродажу",

"Валюта" => "руб",

"Курс" => "1",

"Сумма" => "6945",

"Контрагенты" => Array(

"Контрагент" => Array(

"Ид" => null,

"Наименование" => "Иванов",

"ПолноеНаименование" => "Иван",

"Роль" => "Покупатели",

"Адрес" => Array(

"Представление" => "Тест",

"Комментарий" => "Тест"

)

)

),

"Время" => "15:30:15",

"СрокПлатежа" => "0001-01-01",

"Комментарий" => "Заказ с сайта",

"Налоги" => Array(

"Налог" => Array(

"Наименование" => "НДС",

"УчтеноВСумме" => "false",

"Сумма" => "0"

)

),

"Товары" => Array(

"Товар" => Array(

"Ид" => null,

"Артикул" => null,

"Наименование" => "Грабля электронная",

"БазоваяЕдиница" => Array(

"Код" => "796",

"НаименованиеПолное" => "Штука",

"МеждународноеСокращение" => "PCE"

),

"СтавкиНалогов" => Array(

"СтавкаНалога" => Array(

"Наименование" => "НДС",

"Ставка" => "0",

)

),

"ЗначенияРеквизитов" => Array

(

"ЗначениеРеквизита" => Array

(

"0" => Array

(

"Наименование" => "ВидНоменклатуры",

"Значение" => "Товар"

),

"1" => Array

(

"Наименование" => "ТипНоменклатуры",

"Значение" => "Запас"

)

)

),

"ЦенаЗаЕдиницу" => "6945",

"Количество" => "1",

"Резерв" => "1",

"Сумма" => "6945",

"Единица" => "шт",

"Коэффициент" => "1"

)

),

"ЗначенияРеквизитов" => Array

(

"ЗначениеРеквизита" => Array

(

"0" => Array

(

"Наименование" => "Организация",

"Значение" => "ИП Чоршамбе Нет Отчества"

),

"1" => Array

(

"Наименование" => "Вид цен",

"Значение" => "1-2 Единая оптовая"

),

"2" => Array

(

"Наименование" => "Склад",

"Значение" => "Склад №1 для торговли"

),

"4" => Array

(

"Наименование" => "Дата отгрузки",

"Значение" => "2020-05-29"

),

"5" => Array

(

"Наименование" => "Статус заказа",

"Значение" => "Подготовка КП"

),

)

),

)

);

$params = Array();

$params["OrdersData"] = $OrdersData;

// Загружаем заказ с сайта.

//$result = $client->LoadOrders($params);

$idc = Connect1C();

$ret1c = GetData($idc,$params);

var_dump($ret1c->return);


Сразу отвечу на один вопрос, который занимал меня. Как 1С будет привязывать к своей номенклатуре мою заявку. Это потрясающее решение от компании 1С, мне такое даже в голову не могло прийти. При получении заявки 1С смотрит по названию (по названию Карл!??, не по Id, не по штрихкоду, а по названию) есть у неё в номенклатуре такой товар или нет, если нет, она тупо его создаёт, 1С-ники умеют поражать. Так что будьте внимательны названия в заявке должно строго соответствовать названию в 1С, иначе наплодите товаров в номенклатуре.


Ура! Пол дела было сделано. Далее я настроил проброс портов на нашем Mikrotik-е, что бы к 1С серверу можно было обратиться только с IP адреса Web-сервера и определенного порта (не скажу какого).


Дописал скрипты и вот наш интернет магазин сделанный на Joomla + Seblod отправляет заявки в 1С. Всё теперь я то же могу брать 30 т.р. за подключение сайт к 1С ))))

Показать полностью
14

Техническая часть и особенности разработки мониторинга цен

Техническая часть и особенности разработки мониторинга цен PHP, Steam, Playstation, Appstore, Google Play, Xbox, Разработка, Длиннопост

Всех снова приветствую! Занимаясь разработкой сервиса мониторинга цен меня просили также запостить информацию о технической части, как же это устроено, почему именно так. В первую очередь хочется поблагодарить пользователей пикабу за обратную связь и огромнейшую помощь в тестировании проекта, комментариям к его доработке и всем замечаниям которые я стараюсь устранять как можно скорее.


Конечно же сервис (я ранее о нём писал ТУТ) сильно изменился и действительно стал удобнее, я также отслеживаю на нём некоторые приложения — стало информативнее. Но всё же я стараюсь не забывать, что не бывает всё идеально! Понимаю, что еще много всего можно доработать, поэтому будем улучшать и делать информацию еще более полезной! Многие доработки на основе обратной связи я уже внёс, но разумеется будут еще! Итак, начнём наше слишкоммногобукаф =)


Получение информации и приложениях


Изначально при создании такого типа сайта нужно понимать откуда дергать информацию. По сути есть два способа, это прямой парс сайтов, либо использование XML / JSON. В данном случае парс просто "грабит" информацию с сайтов источников, XML / JSON даёт структурированные данные, которые мы обрабатываем на своей стороне.


— Парс: целая куча граблей в корректности информации, если источник изменил верстку — то сервис перестаёт работать и получать нужные данные, либо начинает "мусорить". Подобное уже случалось с Google Play Market, когда те обновили верстку и много информации попросту потерялось при получении данных о приложении.

— XML / JSON: эти данные имеют свою четкую структуру данных, которую мы принимаем на своей стороне и обрабатываем, то есть со временем у нас не пропадёт информация и поля с данными никуда не уедут.


В данном случае надёжным будет XML / JSON, т.к. точность данных не нарушается со временем в результате каких-то обновлений, исключением скорее может быть нерабочий сервис источника. В целом разработчики эти особенности знают.


Ок, откуда получать информацию о приложениях?


— Google Play Маркет (не даёт никаких API, тут нужен скрипт парсинга и никак иначе)

— AppStore (даёт RSS XML либо RSS / JSON)

— PS Store (даёт API JSON)

— Microsoft Store / Xbox Live Store (не даёт официального api, но есть сервис xboxapi.com, к сожалению платный)

— Steam (даёт API JSON)


// Appstore API
$url = file_get_contents('http://itunes.apple.com/lookup?id=XXXXXXX&country=ru');
$data = json_decode($url);
$data = $data->results[0];

// Выводим всю информацию о приложении, которую отдаёт нам Apple
print_r($data);

// Название

$name = $data->trackName;

// Описание

$description = $data->description;

// Категория

$category = $data->primaryGenreName;

...

Данный отрывок кода — стандартное получение данных API из JSON AppStore, далее подставляем нужный ID, обрабатываем через PHP и погнали. Аналогично по данному типу работают все приложения, мы просто подставляем ID и запрашиваем свежую информацию о приложении. Сервис AppStore и, в нашем случае Google Play, не предоставляют информацию о скидках, они пишут только актуальную цену и всё, поэтому её мы пишем в базу, запоминаем и сравниваем с периодичным обновлением по крону. Способ не самый изящный, но другого в принципе нет. Разве что можно писать не в базу, а в файлы, но где хранить информацию это скорее вопрос оптимизации скрипта и данных. В других сервисах аналогично, за исключением Play Market-a.


Остальные сервисы по аналогии, ставим на Cron и обновляем каждые 1-2 часа для поддержания актуальности данных. И вот мы потратили много времени и подготовили все скрипты по подгрузке и обновлению данных. Теперь мы вынуждены столкнуться с некоторыми нюансиками этого проекта, о чём и пойдёт речь далее.


Без нюансов? Нет, не слышал!


Для расширения функционала сервиса и улучшения его качества появляются те самые нюансы, которые приносят расходы:


— домен и хостинг (это обязательная часть сайта — без них никуда. Т.к. проект работает с большим объёмом информации, то обычный дешевый хостинг не пойдёт, а это уже от 300 руб./мес., но я не сторонник хостингов и поэтому проект ушёл на вдс, т.к. хостеры часто любят ограничивать нас выделенной памятью, временем выполнения скрипта, отключать директиву allow_url_open и еще целая куча косяков и приколов в зависимости от хостера)

— xbox api — является платным (аналоги я искал долго и упорно — ничего нет). Бесплатный тариф имеет ограничения (60 запросов в час), которые быстро будут исчерпаны при заполнении раздела приложениями.

— SMS уведомления для тех, кто не читает почту и воспринимает её как сборник спама. Чтобы это полноценно работало и точно приходили оповещения (а не через раз), пришлось воспользоваться сервисом смс. ру и через него слать сообщения, которые оплачиваются в среднем от 3 до 7 руб. за шт в зависимости от условий и содержания сообщения.


То есть получается, что я стараюсь сделать проект, который будет полезен и поможет получить халяву, но при этом плюсуются обязательные расходы. Я даже не считаю личную занятость и затрачиваемое время, т.к. мне самому интересно и это моё хобби, хочется сделать полезный продукт несмотря ни на что, плюс я тоже им пользуюсь. Но вот расходы получается неотъемлемая часть проекта и в любом случае мне нужно их минимизировать, в результате чего мне пришлось ввести платный аккаунт с минимальной ценой (промо коды на полный акк я давал в самом первом посте) для компенсации расходов по самым минимальным подсчетам и вынужден немного ограничить рамки пользователей.


Рассмотрим эти расходы на примере грубых подсчетов


— Например, что сейчас на сайте 500+ пользователей, каждый из них может быть подписан на 30 приложений. Выходит 15000 уведомлений в день на готовности рассылки, из которых может быть 5% оповещений, а это 750 шт минимум. Даже если 10% пользователей будут пользоваться смс уведомлениями, это 75 смс уведомлений по средней цене 5 руб за штуку, так мы получаем 375 руб. в день расходов только на смс, а это 11+ тыс. рублей в месяц при самым грубым подсчетам!

Техническая часть и особенности разработки мониторинга цен PHP, Steam, Playstation, Appstore, Google Play, Xbox, Разработка, Длиннопост

Вот так вот, сделал доброе дело называется!


Бюджет Xbox Api более щедящий, просматривая тарифы я думаю вполне будет достаточно 400-1000 запросов в час за 2 фунта (189 руб) или 5 фунтов (473 руб) в месяц, чтобы это было с запасом, но это зависит напрямую от количества приложений на сайте, которое всегда пополняется.

Техническая часть и особенности разработки мониторинга цен PHP, Steam, Playstation, Appstore, Google Play, Xbox, Разработка, Длиннопост

Чтобы сервис работал и давал максимум функционала и минимум граблей — это не много. Не спорю можно сделать обычный парс и снизить эти расходы, но если вся конструкция развалится, то будет не очень хорошо.


По итогу выходит, что минимальные расходы ежемесячно на такой тип проекта могут быть примерно 12 т.р. в месяц по самым грубым подсчетам (144 000 руб в год). В общем как я уже писал, это всё крайне грубые подсчёты, прошу не ругать меня. Вообще логично, что такой сервис и вовсе должен быть фулл фри (ну или фулл картошека по деревенски).


Эти расходы не нужны, на основе отзывов пользователей вероятно потребуется исключать функционал с СМС, пусть все пользуются!


НЕСИТИ КОФИ! ГДЕ КОФИ!? Нужно больше информации!


И так, когда наш мозг уже окончательно перестал соображать после написания всех скриптов, учёта нюансов — у нас есть еще задачи по улучшению и мы начинаем прикручивать магазины для сравнения цен.

Техническая часть и особенности разработки мониторинга цен PHP, Steam, Playstation, Appstore, Google Play, Xbox, Разработка, Длиннопост

Аналогичная ситуация с API / XML, если есть структурированные данные, то мы можем полноценно с ними работать. Но не все магазины их предоставляют, чаще это магазины с наличием партнерок. Подключаем доступные (Steam pay, steam buy, Бука). Теперь у нас есть сравнение цен.


Далее полным ходом идёт подбор магазинов, а это процесс сам по себе не быстрый. Кстати, магазины с партнёрками дают откаты проекту с продаж (но не все), то есть не наценку за товар, а именно откат, при котором магазин зарабатывает чуть меньше. В целом я думаю вполне корректно рассмотреть это как альтернативу компенсации финансов на обслуживание проекта, которую я думаю многие поддержат, ведь проект выходит в каком-то смысле на "самокоменсацию" за счёт подключаемых магазинов, а не пользователей. НО к сожалению их не много, поэтому на данный момент это не работает должным образом, остаётся лишь тестировать. Теперь, когда всё работает, подгружается, сравнение цен дополнило картину — я должен отметить, это действительно очень удобно. Нужно подключать вообще все на свете магазины больше магазинов!


Подключаю я значит сервис Plati, а там продавцы не имеют никакого регламента по заполнению названий и описания продуктов, в итоге мы имеем полный бардак в поиске и подборе названий товаров для сравнения. Я постарался обработать информацию как мог находя точные совпадения названий к товарам с учётом их обработки и удаления спецсимволов.

Техническая часть и особенности разработки мониторинга цен PHP, Steam, Playstation, Appstore, Google Play, Xbox, Разработка, Длиннопост

Кустарный способ обработки, т.к. символы дополнял и проводил определенные тесты, но уже переписал в массив и скорректировал код. Теперь мы перестали учитывать с обеих сторон всякие ТМ, Р и прочий мусор, который где-то есть, а где-то его нет. Информация о ценах стала подгружаться лучше, вроде работает. Теперь рассматриваю новые магазины, в обратную связь писали про Zaka-Zaka, но API они не предоставляют, к сожалению. Во многих местах там зацепиться не за что, а переходить на обычный парс HTML страниц не надёжно, хотя не всё же не исключаю такой ход для обеспечения функционала, написал определенную защиту и автоматически отключать показы в случае, если информация пошла некорректно.

Подведём итоги


Получается для создания подобного проекта (который совмещает в себе кучу разных магазинов и платформ, а также умеющий автоматом информировать) нужно не только выделить огромное количество своего времени помимо рабочих задач, учитывать интересы пользователя (это конечно в первую очередь, иначе все старания будут напрасны). Сколько себя знаю, занимаясь ковырянием в носу разработкой с примерно 2007 года (тогда я только начинал вникать во всё это и потихоньку изучать HTML) — я всегда мечтал построить что-то дельное, полезное и для людей! Теперь я понимаю, что такой проект я сделал и на основе отзывов можно сказать, что он действительно полезен, а поэтому — моя цель сделать еще лучше, еще интереснее и еще полезнее! Поэтому буду надеяться на Вашу помощь и поддержку, ведь поддержка в данном случае это и есть главная мотивация.


ps. Отдельные технические моменты я не стал писать, было и есть множество сложностей, все их тяжело описать одним разом и везде уделить внимание, плюс всё же чисто технический пост с кодом будет актуален скорее для других площадок.


еще. Скажу так, терпения тоже нужно очень много, иногда ошибки появляются даже чисто случайно и приходится в срочном режиме всё исправлять, а в некоторых случаях на это может уйти много времени.


В общем, стараюсь для Вас как могу!


Credits:


Не сплю, не ем, работаю над проектом и заряжаюсь от сети:

Техническая часть и особенности разработки мониторинга цен PHP, Steam, Playstation, Appstore, Google Play, Xbox, Разработка, Длиннопост

А это после очередного большого обновления:

Техническая часть и особенности разработки мониторинга цен PHP, Steam, Playstation, Appstore, Google Play, Xbox, Разработка, Длиннопост
Показать полностью 6
4379

Про взлом сайта

Вспомнил историю, хочу поделиться. Может кому то интересно, что значит "взлом сайта" и как это делают.

Был у меня малюсенький сайт в годах примерно 2010-2014. Сайт - интернет магазин, где я продавал свои же php скрипты и давал возможность любому продавать на нём свои скрипты и брал за это 10%. Сайт был не прибыльным, но и содержание его мне ни чего не стоило. И написал я его полностью сам, совершенствуя навык программирования. Был этот сайт полностью автоматизирован.. Т.е. пополнение баланса через webmoney, покупка, продажа, вывод денег, оповещения о продажах по смс... Всё проходило автоматически и без моего участия. К сайту был привязан кошелек, на котором лежало около 3000р.

Однажды мне позвонил какой-то паренек.. 17 лет ему было. И представился как человек, взломавший мой сайт.

И действительно, парень вывел на свой кошелек все деньги с кошелька сайта. Он их мне вернул и рассказал про уязвимость.

А уязвимость просто наитупейшая... Немного об алгоритме программы: при покупке какого-то товара, программа проверяла, если на счету покупателя денег больше чем цена товара, то из его счета вычиталась эта сумма и отдавался товар. Так вот. В программе при добавлении товара на сайт я не сделал проверку на отрицательную цену. Чувак просто добавил товар с отрицательной ценой, допустим -500р. Потом с другого аккаунта стал покупать свой же товар. Программа проверила, что на его нулевом счету денег больше, чем -500 и вычла из нуля минус пятьсот... Минус на минус дало плюс и его счет увеличился на 500р при покупке товара. Потом он заказал вывод средств и программа в автоматическом режиме перевела деньги на его кошелек.

К тому времени я уже забросил этот сайт.. Больше года им не занимался, и решил просто отдать его тому парню... Он согласился, но видимо ему сайт быстро надоел и уже через пару месяцев он перестал существовать.

240

Бесплатная книга «Заметки по PHP»

У меня есть сайт, где я публикую свои заметки по программированию. Решил попробовать сделать раздел по PHP в виде книги (формат PDF). В итоге по объёму получилось 72 страницы.


Все статьи уникальны, т.е. написаны мною.


Скачать книгу можно по этой ссылке: https://yadi.sk/i/aSudVcy-3KucBN

18

Агрегатор контента своими руками. Попытка №2.

Агрегатор контента своими руками. Попытка №2. Веб-Разработка, Создание сайта, Агрегатор для агрегаторов, Telegram бот, Rss, SMM, Длиннопост

Привет моим верным подписчикам и лиге вэб разработчиков! В данном посте я поведаю о:

- паре забавных случаев, возникших при разработке новой версии моего агрегатора котиков и мемасиков (а так же новостей, видео, пабликов, групп, RSS и Telegram каналов );

- текущем состоянии дел и планах развития.


Около 800 дней назад я опубликовал первую версию агрегатора контента и сделал пост на пикабу. Сервис получился неплохим и мои цели удовлетворял. Я пользовался им каждый день, для просотра мемасиков и котеек. Но, к сожалению, большого интереса у пользователей не вызывал. А в комментариях знающие люди советовали весь функционал перенести на сервер, что бы на клиентских устройствах все работало максимально быстро.


Так как по своей натуре я перфекционист, то идея сделать все "красиво" не давала мне покоя и в 2017 году я наконец сдался и решился переписать все с 0, нанять хорошего дизайнера и выкатить ресурс который заткнет за пояс конкурентов :) Получилось ли у меня или это очередное фиаско, я надеюсь узнать сегодня, в комментариях к этому посту :)


Итак, начнем с пары интересных задач, которые пришлось решить при разработке.


1. Как я добавлял вывод телеграмм каналов.


В последний год появляется все больше популярных телеграм-каналов. Но лично мне не удобно читать их в приложении, хотя я не пробовал :). Я сразу запланировал, что в новой версии агрегатора обязательно должна быть возможность вывести в свою ленту посты из любых публичных телеграм-каналов вместе со всеми другими источниками.


Обилие инструкций по работе с телеграм-ботами воодушевляло и я рассчитывал, что задача не займет много времени. И еще я не понимал, почему никто не сделал аналогичного сервиса :)


Как это всегда бывает в разработке, препятствия возникли на ровном месте: оказалось, что для того, что бы бот мог читать какой-то канал, бота надо туда добавить. Поэтому вариант сразу отпал. И я перешел к чтению мануалов на основной API телеграма.


Через 30 минут изучения документации я был в отчаянии.



Все данные у телеграма шифруются, что бы получить что то от их серверов нужно обладать степенью магистра по криптографии... И, конечно, обычные http запросы - это не для них, только низкоуровневые socket, отдающие чистые байты, только хардкор. Вообщем без сторонней помощи задача была нерешаемая.


Несколько дней поиска привели меня к решению: использовать на сервере opensource php телеграм клиент. Дада! Можно использовать телеграм под php, и там даже есть поддержка звонков! Это чудо называется madelineProto и исходники доступны на гитхабе.


В итоге, через 3 дня настройки и две блокировки моего аккаунта из-за чрезмерного количества попыток авторизации я настроил клиент и решил задачу. Теперь у меня есть свой шлюз из telegram в web! А пользователи могут читать любые публичные телеграмм каналы у меня на сайте без регистрации и смс.


2. Парсинг youtube каналов.


С API youtube'a вообще вышло забавно. Их справка предлагает использовать php плагин от гугла для доступа к API.  От их API мне нужно было не много: список видео на канале с метаданными, название канала и его логотип. У vk или fb такой запрос создается парой строчек кода и разобраться можно за пол часа.


Но у гугла свой путь разработки :)

Я смирился с тем, что плагин для доступа к API весит более 30 мегабайт. Но я еще и не смог настроить его за 3 часа!

В итоге, кликая на все подряд в справке гугла, оказалось, что плагин можно вообще не использовать, а для получения всей информации - воспользоваться стандартным get запросом, как везде. На формирование запроса мне понадобилось ровно 10 строк кода и 15 минут, вместо 30 мегабайтного плагина.

А потом люди удивляются: "а почему андройд притормаживает на 8-миядерных процессорах и требует 4 гигабайта оперативы?" ;)


3. Что сейчас с агрегатором?


Я запустил вторую версию пару недель назад, и уже выловил все критичные баги. Сейчас все работает стабильно и быстро. Сейчас надеюсь получить отклик от армии пикабу (хотя бы от небольшой ее части), узнать чего им не хватает и что нужно поправить.


4. Планы


- Добавить прямые ссылки на отдельные источники

- Расширять список источников: imgur, rutube, reddit, новостные сайты.

- Привлечь ядро активных пользователей, что бы были данные для формирования ленты популярных постов;

- Добавить в ленту вывод видео и гифок, что бы сократить число внешних переходов;

- Е-маил рассылки с лучшими постами за день/неделю (естественно при желании пользователя);

- Сотрудничество с создателями контента для совместного продвижения.



5. Техническая часть.


Для тех кому интересно то под капотом следующий стек технологий:


Backend: самописный, доставшийся мне в наследство на одном из проектов и переписаный мной под свои нужды. Используется шаблонизатор smarty.

БД: Mysql

Fron-end: HTML + Angular JS 1, так же используется Jquery 2 (в 3-й версии scroll события в firefox не работают периодически) для анимаций.


Парсинг осуществляю с помощью библиотеки php-query или через API раз в 5 минут по CRON'у в порядке живой очереди с приоритетом на публичные источники. Т.е. если за 4 минуты сайт не успел пройтись по всем источникам, то скрипт останавливается. А в следующий раз в начале очереди находятся те источники, которые дольше всего не обновлялись. Очереди для публичных и персональных источников разные - по 2 минуты и на те и на другие.


Если вас заинтересовал проект, то буду очень признателен за любые отзывы и комментарии. Ссылка (на пикабу, вроде, разрешено в конце поста давать ссылку): https://i-c-a.su/

Показать полностью
71

История одной галочки

Это - галочка.  Я сделал ее лет 17 назад, когда мне самому было 15 и я только начал изучать PHP.

История одной галочки Администрация, PHP, Программирование, Рукожоп, Uspeli, Бунт

Галочка позволяла закрывать контент 18+ или личные комментарии на сайте.

Галочка была сделана за 10 минут.

И представляла собой просто значение в базе 0 - 1.


Галочку сделал практически школьник. Но она и сейчас спасла бы Пикабу от бунта и от потери 50 000 человек.

@admin, у вас правда нет программиста, который может добавить 1 поле в базу и чекбокс к комментариям?


Просто же:

<input type="checkbox" name="NSFW">


Вот и все. Осталось поймать значение и записать в базу единичку!

<?php

if (isset($_POST["NSFW"])){ /* Магия записи в базу */ }

?>


Я уже молчу о чем-то более сложном - как определение контента 18+ по тем же  дубликатам, например. Эх. Уже просто нет слов.

8

Насколько ты предсказуем?

Хочу поделится историей создания одного сайтика. Так уж совпало, что не так давно я решил изучить один PHP фреймворк (YII2), но тренироваться на стандартных примерах типа интернет магазина было скучно, поэтому я решил придумать что-то оригинальное. И тут я наткнулся на это видео

И тут меня накрыло. Если вкратце, речь идет о том, что если бы человеку предложили игру, в котором он мог сделать выбор, взять одну или две коробки. В первой коробке всегда 1000$, во второй либо 0, либо миллион. Также есть некая сущность которая может предсказать выбор человека, и если эта сущность считает, что человек возьмет обе коробки, то во вторую коробку она не положит ничего. И если, вероятность верно предсказать действия человека (взять одну или две коробки), больше 50%, то получается парадокс: теория игр говорит что выгоднее всего брать обе коробки, а статистика что только одну.


Это подводит нас к размышлениям о свободе воли человека и о возможности предсказать его действия. Но самое главное, в условиях игры сказано, что ни человек, ни компьютерная программа, которая будет делать выбор, не имеют права подбрасывать монетку/использовать генератор случайных чисел. Это показалось мне интересным, я задумался, может ли мозг генерировать абсолютно случайные числа, а лучше последовательности чисел. Для начала я сравнил наше сознание с тем, что мне как программисту ближе, с нейронными сетями. Поискав я наткнулся на эту серию статей на Хабре: Нейросети для чайников(https://habr.com/ru/post/143129/).


Результаты были неутешительны, большинство нейросетей детерминированы, то есть зная состояние сети в данный момент можно предсказать ее решение. Оставалась надежда только на человеческий мозг. Я конечно мог проверить только свою способность к генерации случайных чисел, но один человек это не показатель, и тут мне пришла в голову идея написать сайт, на котором любой желающий может проверить то, насколько случайны последовательности чисел, выдаваемые его мозгом.


Дизайн у сайта получился простенький (читай "И так сойдет"):

Насколько ты предсказуем? Длиннопост, Сайт, Программирование, Генератор случайных чисел, Видео

Теперь можно проверить, насколько случайна та или иная последовательность, по нескольким показателям. И получить средний результат в процентах.

Насколько ты предсказуем? Длиннопост, Сайт, Программирование, Генератор случайных чисел, Видео

Для того кому интересно как оцениваются величины, а также как устроен сам сайт, я оставлю ссылку на GitHub.


Когда сайт был закончен, я понял что неплохо бы его где-то разместить. К счастью, сейчас можно найти абсолютно бесплатные хостинги и домены, возможности которых на данном этапе меня вполне устроили.


Итак, кому интересно могут зайти по следующим ссылкам:

GitHub: https://github.com/BasValery/RandomSeed

Сам сайт: http://randomseed.ml/

Показать полностью 2
10

День рождения и квесты!

Все события произошли ещё в июне прошлого года, но написать о всём том решил я только сейчас. Почему? Не знаю! Хотел ещё тогда, но как-то руки не доходили, а потом уже подзабылось как-то и стало не очень актуально, но сейчас по некоторым причинам немножко снова взялся за этот проектик, вот и вспомнил, захотелось поделиться теми классными впечатлениями и событиями, что были тогда, в самый первый раз :)

Кому-то покажется это всё ерундой и чем-то не интересным, а кто-то, быть может, с интересом прочитает, каждому своё, но я чувствую, что сейчас я должен это всё написать.


Дело в том, что общался я тогда с одной замечательной девушкой, хорошо общались мы, было круто! Но сейчас история общения и что было дальше не особо интересна, не о ней речь. Единственное, что нужно знать, что девушка та очень любит сов в любом их виде (нет-нет, про их поедание речи не идёт!). И захотелось мне сделать подарок ей на день рождения, да не обычный какой-нибудь, а особый, какого раньше ещё не делал никому! Решил я сделать для неё квест небольшой. Но делать просто квест одноразовый -- это как-то не круто. Поэтому решил написать я небольшой квестовый движок, чтоб потом можно было какие угодно задания туда писать и всё менять на ходу, без необходимости лезть в какие-то исходники и вручную править код, а чтоб всё красивенько и удобненько работало через интерфейс приятный, да и чтоб можно было потом и другие квесты тоже проводить, штука-то полезная и в перспективе тоже, ведь можно применить много где.

Начал разработку этого квестового движка. По сути, это просто определённой функциональности сайт с адаптивной вёрсткой, чтоб автоматически подстраивался под размер экрана, чтоб и с телефона было удобно пользоваться, и с устройств с большим экраном тоже.

Делать всё это было весьма интересно! Вот ещё раз убедился, что когда под вдохновением делаешь что-то для кого-то, то мозг намного больше энергии на это всё выделяет, как-то намного охотнее и интереснее это делать, да и приятнее тоже.

Пока писал движок, в это же время готовил разные части подарков, которые должны были тоже участвовать в квесте, хоть я пока точно не представлял, как именно это будет. Среди них было два набора стикеров с совами (заказывал где-то), кружка с собственным дизайном, тоже с совами и ещё другими животными; и ещё вручную на маленьком прямоугольном кусочке фанеры выжег тоже сову, получилась прикольная такая фанерная карточка с совой, пусть и немного криво выжженой, потому что большим жалом маленький рисунок не очень удобно выжигать, особенно, когда опыта в этом особо нет.. )

Ещё подготовил аудиозапись специальную, FM-передатчик, роутер с OpenWRT на борту и настроенным веб-сервером и Wi-Fi с определённым паролем, были некоторые задумки по этому поводу тоже.

Две недели в свободное время я пилил движок (больше по ночам, днём другие дела были), наверное, даже жил этим, представлял, что и как можно сделать, какие задания и т.д. Но точного сценария так и не было.

В движке есть поддержка заданий, карта, инвентарь. Меня очень пёрло от мыслей о том, что можно связать реальность и виртуальность, потому что предметы, что были в реальности, я загнал и в движок тоже, они могли выдаваться за задания и находиться в инвентаре игрока. Карта нужна для того, чтоб знать, куда идти, если это необходимо по заданию (заодно и я мог наблюдать, где находится сейчас она). А в самих заданиях можно писать текст, по разному оформленный, картинки вставлять, там удобный редактор, позволяющий делать всё это. В заданиях можно указывать координаты, куда нужно идти; запрашивать определённый ответ, присваивать определённый текст кнопки для выполнения задания, чтоб можно было не просто на "Дальше" нажимать, а именно в зависимости от тематики задания указывать определённый текст на кнопке. Также можно указать предмет из инвентаря, необходимый для выполнения задания, а при завершении задания можно выдать какой-то предмет, а также есть возможность указать следующее задание, таким образом строится цепочка заданий в нужном порядке. Хотел сделать возможность разветвления: разные кнопки -- разные следующие задания, но подумал, что это не особо нужно было, на тот момент достаточно было и одной сюжетной ветки, к тому же, времени было мало. Ещё были мысли тогда про такой тип заданий, где нужно придти в определённую точку на карте, и лишь после этого можно будет продолжить, но тоже пока реализовывать не стал.


Свой подарок "вручить" решил я на пару дней позже, чем был сам день рождения, чтоб не было слишком много впечатлений было в один день, да и просто не успевал я немного.


Но вот настал тот самый день!
Помню, это была пятница, шёл дождик. Я назначил время старта на 3 часа дня. А сам только в два часа закончил делать движок. И то, не всё до конца закончил, со стороны "админки" там вообще почти ничего нет, кроме самого необходимого минимума. И вот за час до начала игры пошёл готовить локации. Опять же, не было ни сценария, ни плана, были просто разные части подарков и некоторые идеи. И лил дождь. Ввиду того, что по работе есть много знакомых в городе, потому что мы обслуживаем разные организации, то пошёл я в первую очередь именно к тем людям, которых знал уже, в фирмы какие-то, в магазины. Пришёл, объяснил, что придёт девушка, отдаст шишку лесную (они у неё заранее были, в день рождения отдал вместе с коробочкой-инвентарём, а шишки -- это как валюта), а ей в обмен на шишку должны будут отдать очередной предмет.

На каждом предмете был указан код, который необходимо было ввести в движке для выполнения задания.

Ходил также и к незнакомым людям, в пиццерию, в цветочный магазин, помню, зашёл, объяснил всё это той девушке, что там работала, она так заинтересовалась и так серьёзно к этому отнеслась, что даже на бумажке инструкции для себя записала и тоже ждала с нетерпением нужного времени!

В офисе на работе на окошко поставил плеер с зацикленной аудиозаписью, в которой бот Максим говорил своим голосом нужный циферный код, и всё это транслировалось по обычному радио, на частоте 108.0 FM. Для передачи использовал недорогой FM-трансмиттер, купленный на алике и собранный вручную (это был DIY-комплект).

Недалеко от рабочего офиса находится другая обслуживаемая нами фирма, туда поставил небольшой роутер на окошко, а в роутере... А об этом позже :)

За пол часа до начала игры сел писать сценарий. Было известно, где какие части подарков находятся, в каких локациях, и какие коды на них написаны. Задания, состоящие просто из текста были не так интересны, поэтому решил привлечь кота Пушина, будто бы он обращается к нашей главной героине и просит помощи в поиске пропавших сов! Сначала было пару заданий для обучения, где показано было, как вводить ответы, как по карте ориентироваться, а потом уже началась сама история сюжетом, который был буквально на ходу придуман.

Выглядело это всё вот так:

В списке заданий изначально отображались только активные задания, а уже позже, через пару месяцев после всех этих событий, добавил возможность просматривать уже выполненные задания, чтобы ещё раз пройтись по той истории :)

И, кстати, активных заданий может быть несколько, поэтому, всё же, можно делать разные сюжетные линии и связывать их. Например, в одной ветке в каком-то задании будет выдан предмет, который нужен будет в задании другой ветки. Так-то!

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Началось всё с обучения, ведь нужно показать, что как.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Нажали на кнопку и попали в следующее задание.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Вот так выглядел инвентарь, но это из панели администрирования, где можно было редактировать описание, картинки устанавливать каждому предмету, удалять их и т.д.

Некоторые предметы, хоть они и не участвовали непосредственно в игре, но были подарены на ДР, решил тоже добавить в инвентарь. Они ведь есть у неё уже, так что пусть будут и в инвентаре!

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

А вот так инвентарь выглядит со стороны игрока. Не стоит удивляться, что там такое количество предметов. Дело в том, что сейчас скриншоты делаю я из под своего аккаунта, а пока тестировал разные задания, их проходилось по несколько раз проходить, поэтому некоторые предметы выдавались несколько раз.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Итак, продолжим проходить по заданиям! Тут я сначала нарочно ввёл неправильный ответ, чтобы показать, что происходит при этом.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Ввели правильный ответ, следующее задание.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Если нажать на ссылку "показать локацию на карте", то откроется, как ни странно, карта, где будет указано, куда идти. А также можно быстро вернуться обратно к заданию.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

А ещё на карте можно посмотреть свою текущую позицию, которая, кстати, отображается тоже в виде совы. Ну, почему бы и нет? Жмёшь на кнопку "Где я?", а тебе в ответ вот это:

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

И снова возвращаемся к заданиям. Вот, всё началось!

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

А вот в следующем задании уже нужно было "перехватывать радиоэфир" для того, чтобы узнать код. Как я уже писал выше, с плеера через FM-трансмиттер транслировался записанный аудио-код, который и нужно было ввести в качестве ответа на задание. Помню, сидел я тогда в офисе, смотрел из окошка (второй этаж), и вот она подошла к окну, но тут я уже вышел помочь, потому что до этого там ещё парень с девушкой были в качестве помощников, но они потом ушли по делам, поэтому дальше решил я сам сопроводить, к тому же, приближалась сложная часть. Технически сложная. Может, и не сложная, но человеку, который этим не занимается, всё же, не совсем понятная. Уже тогда у главной героини торжества впечатления были очень хорошие, эмоций тоже много! Всё же, не каждый раз так интересно день рождения проводится :)

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Настало время рассказать про ту штуку с роутером, хотя, думаю, из следующего задания всё и так понятно будет :)

Но суть в том, что на роутере был поднят небольшой веб-сервер, где была простенькая веб-страничка со ссылкой на другую страницу, где просто лежали файлики текстовые, в одном из них был ответ на задание, а ещё там были мои заметки, которые тоже были частью подарка. Этот роутер раздавал не только wi-fi, но и интернет, чтобы можно было, будучи подключенным к нему, не только в его файлах поковыряться, но и доступ к интернету иметь для продолжения выполнения заданий. Единственное, чего я не учёл -- это то, что в той фирме рабочий день окончился, и они почему-то отключили интернет, поэтому роутер раздавал просто wi-fi, но это не стало большой проблемой.

К сожалению, не могу показать сейчас, как выглядела страничка из роутера, потому что за этот год уже много раз там всё переделывалось, а сам роутер тот трудится сейчас совершенно в другом месте.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

И вот всё уже подходит к завершающей стадии.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Самое последнее задание -- чаепитие :)

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Даже сейчас, делясь с вами этими заданиями, сам снова испытал хотя бы немножко те клёвые эмоции, что были тогда! Для меня это было чем-то необычным, ведь не часто такое происходит, да и реакция девушки, для которой всё это делалось, тоже порадовала весьма! А учитывая то, что планировать я не умею, а тут удалось так хорошо всё провернуть, то это вдвойне приятней, хотя, учитывая то, что сам квест был написать за пол часа до его начала... :)

И в начале я писал, что не знаю, зачем захотелось поделиться этим всем, но сейчас понимаю, что оно точно того стоило! А движок до сих пор используется порой на каких-нибудь праздниках или других событиях, и пусть проводятся не такие сложные и масштабные квесты, но приятно помнить о том, с чего всё началось, и что сейчас это тоже приносит пользу.


Всем спасибо за внимание и за возможность поделиться :)

Надеюсь, мне удалось хоть немножко передать ту необычную атмосферу, заинтересовать вас и поколебать стрелку мимиметра )

Показать полностью 18
Мои подписки
Подписывайтесь на интересные вам теги, сообщества,
пользователей — и читайте персональное «Горячее».
Чтобы добавить подписку, нужно авторизоваться.
Отличная работа, все прочитано!