<?php
namespace insta\Instagram\Service;
use Carbon\Carbon;
use insta\Instagram\{
Constant,
Device,
Request
};
use App\Models\Account as AccountTable;
use GuzzleHttp\Exception\ClientException;
class Account extends Request
{
private string $username;
private string $password;
public static $account;
/**
* @var Device $device
*/
private $device;
public function __construct()
{
parent::__construct();
$this->device = new Device();
}
public function login(string $username, string $password)
{
$account = AccountTable::where('username', $username)->first();
if ($account && $account->state == 'logged_in') {
self::$account = $account;
return true;
}
$this->username = $username;
$this->password = $password;
$init = $this->init();
$mid = $init->getHeader('Ig-Set-X-Mid')[0];
$this->addHeader('X-Mid', $mid);
$this->addHeader('X-Ig-Bandwidth-Speed-Kbps', '-1.000');
$this->addHeader('X-Ig-Bandwidth-Totalbytes-B', '0');
$this->addHeader('X-Ig-Bandwidth-Totaltime-Ms', '0');
$this->addHeader('X-Bloks-Version-Id', Constant::BLOCK_VERSION_ID);
$this->addHeader('Priority', 'u=3');
$this->addHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
$this->addHeader('Accept-Encoding', 'gzip, deflate');
$this->addHeader('X-Fb-Http-Engine', 'Liger');
$this->addHeader('X-Fb-Client-Ip', true);
$this->addHeader('X-Fb-Server-Cluster', true);
$signedBody = [
'jazoest' => '22538',
'country_codes' => '[{\"country_code\":\"90\",\"source\":[\"default\"]}]',
'phone_id' => $this->device->familyDeviceId,
'enc_password' => encrypt_password(password: $this->password, publicKeyId: Constant::PASSWORD_ENC_KEY_ID, publicKey: Constant::PASSWORD_ENC_PUB_KEY),
'username' => $this->username,
'adid' => create_guid(),
'guid' => $this->device->deviceId,
'device_id' => $this->device->androidId,
'google_tokens' => '[]',
'login_attempt_count' => '0'
];
$formData = [
'signed_body' => 'SIGNATURE.'.json_encode($signedBody)
];
try {
$response = $this->post(Constant::BASE_URL.'/api/v1/accounts/login/', $formData);
}
catch (ClientException $clientException) {
$error = json_decode($clientException->getResponse()->getBody());
AccountTable::updateOrCreate([
'username' => $username
], [
'password' => $password,
'last_activity' => Carbon::now(),
'state' => 'error',
'error_message' => $error->message,
'proxy_address' => (parent::$proxy == 0 ? null : parent::$proxy),
]);
return false;
}
$account = AccountTable::updateOrCreate([
'username' => $username
], [
'password' => $password,
'data' => [
'user_id' => $response->getHeader('ig-set-ig-u-ds-user-id')[0],
'token' => $response->getHeader('ig-set-authorization')[0],
'mid' => $mid,
'claim' => $response->getHeader('x-ig-set-www-claim')[0],
'pigeon_session_id' => $this->getDevice()->pigeonSessionId,
'device_id' => $this->getDevice()->deviceId,
'family_device_id' => $this->getDevice()->familyDeviceId,
'android_id' => $this->getDevice()->androidId,
'user_agent' => 'Instagram 265.0.0.19.301 Android (30/11; 480dpi; 1080x2208; TECNO MOBILE LIMITED/TECNO; TECNO KG8; TECNO-KG8; mt6769; tr_TR; 436384411)',
],
'last_activity' => Carbon::now(),
'state' => 'logged_in',
'error_message' => null,
'proxy_address' => (parent::$proxy == 0 ? null : parent::$proxy),
'search_account' => true,
]);
$claim = $this->getClaim($account);
$account->data = array_merge($account->data, ['claim' => $claim]);
$account->save();
self::$account = $account;
return true;
}
private function init()
{
$this->device->generate();
$this->setDevice($this->device);
$response = $this->get(Constant::INIT_BASE_URL.'/api/v1/trusted_friend/get_non_expired_requests_info/');
return $response;
}
public function getClaim(AccountTable $account)
{
$this->addHeader('Authorization', $account->data['token']);
$this->addHeader('X-Ig-Www-Claim', $account->data['claim']);
$this->addHeader('X-Mid', $account->data['mid']);
$this->addHeader('Ig-U-Ds-User-Id', $account->data['user_id']);
$this->addHeader('Ig-Intended-User-Id', $account->data['user_id']);
$this->addHeader('X-Ig-Bandwidth-Speed-Kbps', '-1.000');
$this->addHeader('X-Ig-Bandwidth-Totalbytes-B', '0');
$this->addHeader('X-Ig-Bandwidth-Totaltime-Ms', '0');
$this->addHeader('X-Bloks-Version-Id', Constant::BLOCK_VERSION_ID);
$this->addHeader('Priority', 'u=3');
$this->addHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
$this->addHeader('Accept-Encoding', 'gzip, deflate');
$this->addHeader('X-Fb-Http-Engine', 'Liger');
$this->addHeader('X-Fb-Client-Ip', true);
$this->addHeader('X-Fb-Server-Cluster', true);
$request = $this->get(Constant::INIT_BASE_URL.'/api/v1/multiple_accounts/get_account_family/');
return $request->getHeader('x-ig-set-www-claim')[0];
}
}burada bulunan login challenge durumunu kontrol etmiyor örnek bir hesap challenge de olsa bile login yaptığını varsayıyor aktif olarak gösteriyor username bilgisi user_id bilgisini vs çekiyor ve aktif kullanıcı sayısında aktif olarak gösteriyor bu durumu nasıl çözebilirim? direk tüm kodları yazdım yardımcı olabilecek biri?