Ich versuche, mich mit vier zu authentifizieren. Ich habe mehrere Ansätze ausprobiert, um Nachrichten mit dem privaten Schlüssel meiner Brieftasche zu unterschreiben, aber keiner von ihnen erzeugt eine Signatur, die die Four.meme -API akzeptiert.
Code: Select all
import requests
from web3 import Web3, Account
from eth_account.messages import encode_defunct
# Setup
PRIVATE_KEY = "YOUR_PRIVATE_KEY" # Private key redacted for security
WALLET_ADDRESS = Web3.to_checksum_address("0x8358494c81a35db01AfB1EEb93cBfe995B0cF057")
web3 = Web3(Web3.HTTPProvider("https://bsc-dataseed.binance.org/"))
# Create session
session = requests.Session()
session.headers.update({
"Origin": "https://four.meme",
"Referer": "https://four.meme/",
"User-Agent": "Mozilla/5.0",
"Content-Type": "application/json"
})
# Get nonce
nonce_url = "https://four.meme/meme-api/v1/private/user/nonce/generate"
nonce_payload = {
"accountAddress": WALLET_ADDRESS,
"verifyType": "LOGIN"
}
resp = session.post(nonce_url, json=nonce_payload)
nonce = resp.json()["data"]
# Sign message
message = str(nonce) # Just the nonce as a string, without formatting
message_encoded = encode_defunct(text=message)
signed_msg = Account.from_key(PRIVATE_KEY).sign_message(message_encoded)
signature = signed_msg.signature.hex()
if not signature.startswith("0x"):
signature = "0x" + signature
# Login attempt
login_url = "https://four.meme/meme-api/v1/private/user/login/dex"
login_payload = {
"region": "WEB",
"langType": "EN",
"loginIp": "",
"inviteCode": "",
"verifyInfo": {
"address": WALLET_ADDRESS,
"networkCode": "BSC",
"signature": signature,
"verifyType": "LOGIN"
},
"walletName": "MetaMask"
}
login_resp = session.post(login_url, json=login_payload)
print(login_resp.json()) # {"code": -1006, "msg": "Signature for this request is not valid"}
Different message formats:
Just the nonce as a string: "123456"
Formatted message: "Login Four.Meme:\n\n123456"
Hex-encoded nonce
UTF-8 Codierte Bytes < /p>
Verschiedene Signaturmethoden: < /p>
Verwenden von EnCOde_Defunct () mit verschiedenen Parametern
Versicherer-Wiederherstellungs-ID-Formate (0/1 vs 27/28)
persönliche Signaturen-Format mit ETHEREUM-Spezifikations-Prefixes < /p> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /> < /Hier-pl-Schaltungsformats: < /p> < /> < /
Eine Meldung manuell mit Metamaske im Browser
verwendet. (65 Bytes mit 0x Präfix) < /p>
Ich habe sogar versucht, eine erfolgreiche Signatur aus einer Browserverbindung direkt zu kopieren, aber es wird immer noch abgelehnt, wenn ich aus meinem Skript stammt. />
Metamaske für Browservergleich < /p>
Frage < /p>
Was könnte dazu führen, dass die "Signatur für diese Anforderung nicht gültig ist" Fehler, wenn meine Unterschriften korrekt formatiert werden und sich an meine Brieftaschenadresse erholen? Gibt es spezifische Anforderungen für die Signaturvalidierung von Four.Meme, die mir fehlt?