این اسکریپت اتوماتیک اتریوم و توکنهای ERC-20 را از یک کیف پول به آدرس مقصد میفرستد و هر ساعت موجودی کیف پول را چک میکند. بعد از هر تراکنش هم به کمک IFTTT یک اعلان میفرستد. مکانیزم این ربات برای ارسال توکن های اصلی یا همان گس به این شکل است که ابتدا با api سایت کوینگکو قیمت اترویم را حساب میکند و سپس مقدار کس را به دست می اورد ، بعد از به دست آمدن گس مقدار گس را از موجودی توکن اصلی کم میکند و بقیه موجود را به توکن والت مقصد ارسال میکند
این اسکریپت میتواند ترتیب و اولویت ارسال را نیز را درک کنید ، یعنی شما میتوانید به اسکریپت تعریف کنید که ابتدا توکن های فرعی را به والت مقصد ارسال کند ( کاری که هکر ها میکنند ) بعد از ارسال توکن های فرعی ترکن گس را ارسال کند !
در اصل هدف از ارائه این فایل ها و نحوه کار آنها این است که شما بدانید ، اگر امنیت خود را رعایت نکنید ، در صورت لو رفتن پرایوت کی شما هیچ شانسی در مقابل یک هکر حرفه ای ندارد ، بهترین راه این است تمامی موارد امنیتی مربوط به والت خود را رعایت کنید تا درگیر این مشکلات نشوید
- پایتون 3.x روی سیستم شما نصب باشد.
- نصب کتابخانههای Web3.py، Requests و Schedule.
- داشتن شناسه پروژه Infura و کلید API Etherscan.
- حساب کاربری IFTTT برای دریافت اعلانها.
برای نصب پایتون در محیط SSH لینوکس:
sudo apt update
sudo apt install python3 python3-pip
pip3 install web3 requests schedule
ابتدا با git
مخزن گیتهاب را کلون کنید. (فرض میکنیم مخزن شما در آدرس https://github.com/YOUR_GITHUB_REPO
قرار دارد):
git clone https://github.com/YOUR_GITHUB_REPO
cd YOUR_GITHUB_REPO
فایل اسکریپت را باز کنید و موارد زیر را با مقادیر واقعی جایگزین کنید:
infura_url = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'
address = 'YOUR_WALLET_ADDRESS'
private_key = 'YOUR_PRIVATE_KEY'
recipient_address = 'RECIPIENT_WALLET_ADDRESS'
etherscan_api_key = 'YOUR_ETHERSCAN_API_KEY'
ifttt_event_name = 'YOUR_EVENT_NAME'
ifttt_key = 'YOUR_IFTTT_KEY'
برای اجرای اسکریپت در یک اسکرین جدید تا در پسزمینه اجرا شود:
ابتدا اسکرین را باز کنید:
screen -S auto_withdrawal_bot
سپس اسکریپت را اجرا کنید:
python3 auto_withdrawal_bot.py
برای خارج شدن از اسکرین بدون بستن آن:
Ctrl + A سپس D
برای برگشت به اسکرین:
screen -r auto_withdrawal_bot
import time
import requests
from web3 import Web3
import schedule
infura_url = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'
web3 = Web3(Web3.HTTPProvider(infura_url))
address = 'YOUR_WALLET_ADDRESS'
private_key = 'YOUR_PRIVATE_KEY'
recipient_address = 'RECIPIENT_WALLET_ADDRESS'
etherscan_api_key = 'YOUR_ETHERSCAN_API_KEY'
ifttt_event_name = 'YOUR_EVENT_NAME'
ifttt_key = 'YOUR_IFTTT_KEY'
ifttt_url = f'https://maker.ifttt.com/trigger/{ifttt_event_name}/with/key/{ifttt_key}'
def send_ifttt_notification(value1, value2, value3):
data = {'value1': value1, 'value2': value2, 'value3': value3}
requests.post(ifttt_url, json=data)
def get_eth_price():
response = requests.get('https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd')
data = response.json()
return data['ethereum']['usd']
def get_token_contracts(wallet_address):
url = f"https://api.etherscan.io/api?module=account&action=tokenbalance&address={wallet_address}&tag=latest&apikey={etherscan_api_key}"
response = requests.get(url).json()
tokens = {}
for token in response.get('result', []):
token_address = token['contractAddress']
token_symbol = token['symbol']
tokens[token_symbol] = token_address
return tokens
def send_eth_and_tokens():
eth_price = get_eth_price()
balance = web3.eth.get_balance(address)
balance_in_usd = (balance / 10**18) * eth_price
if balance_in_usd > 5:
gas_price = web3.eth.gas_price
gas_limit = 21000
amount = balance - (gas_price * gas_limit)
nonce = web3.eth.getTransactionCount(address)
tx = {
'nonce': nonce,
'to': recipient_address,
'value': amount,
'gas': gas_limit,
'gasPrice': gas_price
}
signed_tx = web3.eth.account.signTransaction(tx, private_key)
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
print(f'ETH sent with hash: {web3.toHex(tx_hash)}')
send_ifttt_notification('ETH Sent', web3.toHex(tx_hash), f'Amount: {amount / 10**18} ETH')
tokens = get_token_contracts(address)
erc20_abi = [
{
'constant': False,
'inputs': [
{'name': '_to', 'type': 'address'},
{'name': '_value', 'type': 'uint256'}
],
'name': 'transfer',
'outputs': [{'name': '', 'type': 'bool'}],
'type': 'function'
}
]
for token_name, token_address in tokens.items():
contract = web3.eth.contract(address=Web3.toChecksumAddress(token_address), abi=erc20_abi)
token_balance = contract.functions.balanceOf(address).call()
if token_balance > 0:
nonce += 1
tx = contract.functions.transfer(recipient_address, token_balance).buildTransaction({
'chainId': 1,
'gas': 70000,
'gasPrice': gas_price,
'nonce': nonce
})
signed_tx = web3.eth.account.signTransaction(tx, private_key)
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
print(f'{token_name} sent with hash: {web3.toHex(tx_hash)}')
send_ifttt_notification(f'{token_name} Sent', web3.toHex(tx_hash), f'Amount: {token_balance / 10**18} {token_name}')
else:
print("Balance is less than $5. No transaction made.")
schedule.every().hour.do(send_eth_and_tokens)
while True:
schedule.run_pending()
time.sleep(1)
-
مطمئن شوید که تمام کتابخانههای مورد نیاز نصب شدهاند.
-
مقادیر جایگزین را با اطلاعات واقعی کیف پول و API خود جایگزین کنید.
-
اسکریپت را اجرا کنید:
python auto_withdrawal_bot.py
اسکریپت هر ساعت یکبار موجودی کیف پول را چک میکند و در صورت بیشتر بودن از 5 دلار، وجوه را منتقل میکند و یک اعلان میفرستد.
##حتماً کلیدهای خصوصی و اطلاعات حساس خود را ایمن نگه دارید. اگر سوالی داشتید میتوانید در بخش issues مطرح کنید