Jako, że miałem więcej czasu to wreszcie przysiadłem i doszedłem do ładu z #wykopapi Okazało się, że problem z hashowaniem był taki, że gdzieś przy stringu dodałem o jeden apostrof za dużo i cały czas miałem response jako nieprawidłowy klucz - w sensie suma md5. Kod, który teraz działa:
Na początku przy użyciu: secret, klucz, połączenie (te dane są na karcie z aplikacją) generuje userkey:
W moim pliku accessdata.py mam taki słownik
secretkey = 'secret' apikey = 'klucz' userkey ='połączenie' login = '1001001' params = {"secret":secretkey, "login":login, "appkey":apikey, "acckey":userkey} Nastepnie kodem odczytuję userkey - ja sobie nazywam go tokenem:
token, content = gettoken(params) accesstoken = {'token':token} with open('token.json', 'w') as f: json.dump(accesstoken, f) f.close() i dalej innym kodem:
import hashlib import requests from accessdata import secretkey, apikey with open('token.json', 'r') as f: token = json.loads(f.read())['token'] f.close() def headers(str2hash): hashed = hashlib.md5(str2hash.encode()) return {'apisign':hashed.hexdigest()} def postentry(secretkey, apikey, token): data = { 'body': f'''Wpis dodany przez API => {datetime.now().strftime("%A, %Y.%m.%d %H:%M")}'''} urlentry = f'''[https://a2.wykop.pl/Entries/Add/appkey/](https://a2.wykop.pl/Entries/Add/appkey/){apikey}/userkey/{token}/''' head = headers(f'''{secretkey}{urlentry}{data['body']}''') head['content-type'] = 'application/x-www-form-urlencoded' #head['data'] = 'full' r = requests.post(urlentry, headers=head, data=data) return r.content Kod może nie jest najlepszej jakości. Ale chciałem żeby działał (⌐͡■͜ʖ͡■) bo już mnie to bardzo irytowało, że zwyczajnie nie mogę tego zrobić. Oczywiście string do body w funkcji postentry należało by dać jako parametr wejściowy ale tak jak napisałem zmienię to już później. Mam nadzieję, że komuś się to przyda. Dodam tag #python jako, że kod jest w tym języku.
Okazało się, że problem z hashowaniem był taki, że gdzieś przy stringu dodałem o jeden apostrof za dużo i cały czas miałem response jako nieprawidłowy klucz - w sensie suma md5.
Kod, który teraz działa:
Na początku przy użyciu: secret, klucz, połączenie (te dane są na karcie z aplikacją) generuje userkey:
W moim pliku accessdata.py mam taki słownik
secretkey = 'secret'
apikey = 'klucz'
userkey ='połączenie'
login = '1001001'
params = {"secret":secretkey,
"login":login,
"appkey":apikey,
"acckey":userkey}
Nastepnie kodem odczytuję userkey - ja sobie nazywam go tokenem:
import hashlib
import logging
import requests
import json
from accessdata import params
def signdata(str2hash):
headers ={}
hashed = hashlib.md5(str2hash.encode())
headers = {'apisign': hashed.hexdigest()}
return headers
def gettoken(logindata):
url = f"[https://a2.wykop.pl/Login/Index/appkey/](https://a2.wykop.pl/Login/Index/appkey/){logindata['appkey']}/"
tohash = f"{logindata['secret']}{url}{logindata['login']},{logindata['acckey']}"
data = {'login': logindata['login'], 'accountkey': logindata['acckey']}
try:
r = requests.post(url, data=data, headers=signdata(tohash))
content = r.json()
print(" json returned: ")
print(content)
print()
userkey = content['data']['userkey']
print(f'userkey token => {userkey}')
except Exception as e:
userkey = 'err'
logging.error(f'{e},{content}')
return userkey, content`
token, content = gettoken(params)
accesstoken = {'token':token}
with open('token.json', 'w') as f:
json.dump(accesstoken, f)
f.close()
i dalej innym kodem:
import hashlib
import requests
from accessdata import secretkey, apikey
with open('token.json', 'r') as f:
token = json.loads(f.read())['token']
f.close()
def headers(str2hash):
hashed = hashlib.md5(str2hash.encode())
return {'apisign':hashed.hexdigest()}
def postentry(secretkey, apikey, token):
data = {
'body': f'''Wpis dodany przez API => {datetime.now().strftime("%A, %Y.%m.%d %H:%M")}'''}
urlentry = f'''[https://a2.wykop.pl/Entries/Add/appkey/](https://a2.wykop.pl/Entries/Add/appkey/){apikey}/userkey/{token}/'''
head = headers(f'''{secretkey}{urlentry}{data['body']}''')
head['content-type'] = 'application/x-www-form-urlencoded'
#head['data'] = 'full'
r = requests.post(urlentry, headers=head, data=data)
return r.content
Kod może nie jest najlepszej jakości. Ale chciałem żeby działał (⌐ ͡■ ͜ʖ ͡■) bo już mnie to bardzo irytowało, że zwyczajnie nie mogę tego zrobić. Oczywiście string do body w funkcji postentry należało by dać jako parametr wejściowy ale tak jak napisałem zmienię to już później.
Mam nadzieję, że komuś się to przyda. Dodam tag #python jako, że kod jest w tym języku.
@asdasdce2w, @krasnoludkolo
@1001001: Jak stosujesz składnie "with open()" to nie musisz już zamykać później. ( ͡° ͜ʖ ͡°)
Dzięki