НУЖНО СДЕЛАТЬ ЧАТ-БОТ [b]ТЗ (сделать аналогичное): [/b] https://t.me/Trader_income_2023_bot?start=1001716199 или http://t.me/ltd_crypto_invest_bot?start=1001716199 [b]Обучение необходимо выстроить так:[/b] https://youtu.be/l5JyisrwCpQ; https://youtu.be/32_BWqdo_xQ; https://youtu.be/ZP-H5OLp1pU [b]Цена: [/b]по договоренности
Доработать парсер сайтов, перестал парсить один сайт,
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.
примерно такой код, сайт https://green-spark.ru/ перестал парсится, нужно починить, и настроить еще один сайт https://siriust.ru/
сайт который парсит на битриксе
namespace Retejo;
use Bitrix\Main\Mail\Event;
class ICPrices
{
public static $elemebIB = 1;
public static $parsSleep = 3;
public static $arParamsPars = array(
array("URL_CON", "PRICE_CON", "PRICE_CON_HIST"),
array("URL_CON_2", "PRICE_CON_2", "PRICE_CON_HIST_2"),
array("URL_CON_3", "PRICE_CON_3", "PRICE_CON_HIST_3"),
);
public static $arParamsName = array(
);
public $info;
public $error;
public static function start($filtEl = null)
{
if(!\CModule::IncludeModule("iblock"))
return;
$arCookie = self::saitCookie();
$arError = array();
$arInfo = array();
foreach (self::$arParamsPars as $k => $v) {
$arEl = self::getListElements($v, $filtEl);
foreach ($arEl as $index => $el)
{
$price = new self($el, $arCookie, $v);
if($price->error) {
$arError[] = $price->info;
}elseif(!empty($price->info)) {
$arInfo[] = $price->info;
}
sleep(self::$parsSleep);
}
}
self::sendEvent($arInfo, $arError);
}
private function sendEvent($arInfo, $arError) {
$CONTENT = "";
if(!empty($arInfo) && is_array($arInfo)) {
$CONTENT .= "
Обнаружено изменение цен по след позициям:
";$CONTENT .= "
Наше названиеНаша ценаЦена конкурента старая : новаяссылка/свойство";
foreach ($arInfo as $k => $v) {
$CONTENT .= $v;
}
$CONTENT .= "
";
}
else {
$CONTENT .= "
Изменения в ценах не найдены;
";
}
if(!empty($arError) && is_array($arError)) {
$CONTENT .= "
Обнаружены ошибки:
";$CONTENT .= "
Наше названиеОшибкассылка/свойство";foreach ($arError as $k => $v) {
$CONTENT .= $v;
}
$CONTENT .= "
";
}
else {
$CONTENT .= "
Ошибки в получение цен не найдены;
";
}
$arEventFields = array(
"CONTENT" => $CONTENT,
);
\CEvent::Send("PRICE_UPDATE", 's1', $arEventFields);
}
private function saitCookie()
{
$arCookie = array();
$agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)';
/*$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => true, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => $agent, // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks
//CURLOPT_HTTPHEADER => array("Cookie: magazine=16374,")
);
$ch = curl_init(/?set_city=16374');
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $content, $matches);
$cookies = array();
foreach($matches[1] as $item) {
parse_str($item, $cookie);
$cookies = array_merge($cookies, $cookie);
}
foreach ($cookies as $k => $v) {
$arCookie["green-spark"] .= $k."=".$v.";";
}
*/
//$arCookie["green-spark"] = "magazine=16374;global_magazine=16374;";
$arCookie["green-spark"] = "hash_=06be6062ae6a3d2b075a15b6cef4a813; __lhash_=1fe6583d3701a8e2be234cbecad08063; PHPSESSID=e80e42e3778c367d4a0a8f8a2a7659d3; BITRIX_SM_SALE_UID=176282213; BITRIX_CONVERSION_CONTEXT_s1=%7B%22ID%22%3A1%2C%22EXPIRE%22%3A1685048340%2C%22UNIQUE%22%3A%5B%22conversion_visit_day%22%5D%7D; BX_USER_ID=29e2d26c83a2582821c5187e97c535cb; _ym_uid=1684985039111269735; _ym_d=1684985039; _ym_isad=2; _ym_visorc=w; magazine=16374; global_magazine=16374; s_id=0;";
/*$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => true, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => $agent, // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks
//CURLOPT_HTTPHEADER => array("Cookie: magazine=16374,")
);
$ch = curl_init('https://liberti.ru/?method=setCurrentStore&cityId=117871&storeId=117870');
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $content, $matches);
$cookies = array();
foreach($matches[1] as $item) {
parse_str($item, $cookie);
$cookies = array_merge($cookies, $cookie);
}
foreach ($cookies as $k => $v) {
$arCookie["liberti"] .= $k."=".$v.";";
}*/
return $arCookie;
}
private function getListElements($arProperty = array("URL_CON", "PRICE_CON", "PRICE_CON_HIST"), $filtEl = null)
{
$arSelect = Array("ID", "NAME", "ACTIVE", "IBLOCK_ID", "CATALOG_GROUP_4");
$arFilter = Array("IBLOCK_ID"=>self::$elemebIB, "ACTIVE"=>"Y", "!PROPERTY_".$arProperty[0] => false);
if(!empty($filtEl)) {
$arFilter = Array("IBLOCK_ID"=>self::$elemebIB, "ACTIVE"=>"Y", "!PROPERTY_".$arProperty[0] => false, "ID" => $filtEl);
}
$res = \CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
$arListElements = [];
while($ob = $res->GetNextElement())
{
$elem = $ob->GetFields();
$elem["PROPERTIES"] = $ob->GetProperties();
$arListElements[] = $elem;
}
return $arListElements;
}
private function update($id, $price, $priceHist, $arProperty = array("URL_CON", "PRICE_CON", "PRICE_CON_HIST"), $dopInfo = "") {
$price = trim($price);
$priceHist = date("Y-m-d H:i") ." = ".$price.$dopInfo."
" . $priceHist;
\CIblockElement::SetPropertyValuesEx($id, self::$elemebIB, [$arProperty[1] => $price, $arProperty[2] => $priceHist]);
}
public function __construct($el, $arCookie, $arProperty = array("URL_CON", "PRICE_CON", "PRICE_CON_HIST"))
{
$this->info = "";
$this->error = false;
if(empty($el["PROPERTIES"][$arProperty[0]]['VALUE']))
return;
$agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)';
$url = $el["PROPERTIES"][$arProperty[0]]['VALUE']."?clear_cache=Y&ncc=Y";
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => false, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => $agent, // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks
);
if (strpos($url, "liberti.ru") !== false) {
$options[CURLOPT_COOKIE] = $arCookie[""];
}
if (strpos($url, "-spark.ru") !== false) {
$options[CURLOPT_COOKIE] = $arCookie["-spark"];
}
if (strpos($url, ".ru") !== false) {
$options[CURLOPT_COOKIE] = $arCookie[""];
}
$ch = curl_init($url);
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
//$strHTML = str_get_html($content);
$dom = \phpQuery::newDocument($content);
$parsPrice = "";
if (strpos($url, "liberti.ru") !== false) {
$parsPrice = $dom->find(".product__price-value:eq(0)")->text(); //$parsPrice = $dom->find(".product__price-value span:eq(0)")->text();
$parsPrice = str_replace(" ₽", "", $parsPrice);
$parsName = $dom->find("h1:eq(0)")->text();
$parsSore = $dom->find(".product-offer-availability__item-value:eq(0)")->text();
}
if (strpos($url, "-spark.ru") !== false) {
$parsPrice = $dom->find(".prices .price:eq(1)")->text();
if(empty($parsPrice))
$parsPrice = $dom->find(".prices .price:eq(1)")->text();
$parsName = $dom->find("h1:eq(0)")->text();
$parsSore = $dom->find(".body-wrapper .quantity .name")->text();
if(empty($parsSore))
$parsSore = $dom->find(".body-wrapper .help-text.transit-txt")->text();
}
if (strpos($url, ".ru") !== false) {
$parsPrice = $dom->find(".price_value:eq(1)")->text();
$parsPrice = str_replace(" ", "!", $parsPrice);
$parsPrice = str_replace(" ", "?", $parsPrice);
$parsPrice = preg_replace('/\s+/ui', '', $parsPrice);
$parsPrice = (int)$parsPrice*1;
$parsName = $dom->find("h1:eq(0)")->text();
$parsSore = $dom->find(".store_view:eq(0)")->text();
}
unset($dom);
$dopInfo = " ".$parsName."".$parsSore."
";
if(!empty($parsPrice)) {
$this->update($el['ID'], $parsPrice, $el["PROPERTIES"][$arProperty[2]]['VALUE']['TEXT'], $arProperty, $dopInfo);
if(trim($parsPrice) != trim($el["PROPERTIES"][$arProperty[1]]['VALUE'])){
$this->info = "".$el["NAME"] . " (".$el["ID"].")"."".$el["CATALOG_PRICE_4"]. "".trim($el["PROPERTIES"][$arProperty[1]]['VALUE'])." : ".trim($parsPrice)."".$url." (".$arProperty[0].")"."";
}
}
else {
$this->error = true;
$this->info = "".$el["NAME"] . " (".$el["ID"].")"."Не удалось получить цену".$url." (".$arProperty[0].")"."";
}
}
}
- Похожие заказы
- Веб-программирование4 заявкиЗакрыт10 месяцев назад
Бот уже готов, нужно просто переписать на API бинанс. Подробности отправлю по запросу в лс.
Веб-программирование4 заявкиЗакрыт10 месяцев назадфункціонал бота: 1. Можливість отримати останні новини натиснувши кнопку "новини" або за допомогою /news. При цьому користувача отримуватиме декілька посилань з різних сайтів 2. Можливість обрати категорії новин (спорт, політика, війна, тощо) і отримувати ...
Веб-программирование3 заявкиЗакрыт10 месяцев назадЯ ищу программиста, который мог бы помочь оценить задачу ниже, а в будущем еще и реализовать это. Возможно, это как раз ты?)Это личный проект.Нужно сделать примерно такой веб-квиз: https://verv.health/plan/?organicPricesV7=trueИз важных элементов:- админка, где можно было ...
Веб-программирование5 заявокЗакрыт10 месяцев назадЗдравствуйте. Данный заказ срочный для опытного съевшего стаю разных собак разработчика. Очень желателен опыт работы с плагином СДЕК, если его нет не критично если вы опытный разработчик. Что имеем: WP+WC с кривой темой на которую почему-то без профессиональных ...
Веб-программирование1 исполнительЗавершенгод назад- Веб-программирование5 заявокЗакрыт10 месяцев назад
Требуется написать парсер с помощью [url=https://github.com/aiogram/aiogram]aiogram[/url] на языке python
Веб-программированиенет заявокЗакрыт10 месяцев назад- $160
Доброго времени суток. Необходим тг бот. Бот - мини маркетплейс, на котором люди могут что-то покупать и что-то продавать. Бот средней сложности, ищу опытных специалистов!!! Система оплаты, интеграция определенных технологий, нужно будет решить пару технических ...
Веб-программирование7 заявокЗакрыт10 месяцев назад Есть почти чистый проект на Laravel. Реализованы только эндпоинты регистрации их надо будет чутка подправить. Уже реализованы миграции для базы. На основе информации, которую скажу нужно будет написать ещё несколько несложных эндпоинтов. В духе - добавляем/сохраняем ...
Веб-программирование6 заявокЗакрыт10 месяцев назадНеобхідно виконати наступні задачі: 1. налаштувати видправку заявок з форми сайту (написаний на CMS Statamic) на пошту GSuite 2. на сервері пошти ввімкнути SMPT 3. налаштувати коректний редірект на сторінку успішної оплати по Fondy (платіжна система) 4. додати ApplePay ...
Веб-программирование2 заявкиЗакрыт10 месяцев назад