返利机器人是什么原理?教你用python自己搭建返利机器人的软件

在市面上有许多返利机器人,我也想自己动手做一个。首先,我们需要了解返利机器人的工作原理。

返利机器人的原理是利用特定算法追踪和获取网络上的优惠券和促销活动,并将这些信息自动推送给指定的目标客户,以满足客户的需求。返利机器人可以追踪客户的购买行为,并自动发送更适合的优惠券和促销活动,以提高客户的购买力和购买意愿。

首先,我们需要选择一个平台。当然要选择佣金水平还不错的,要不然开发的机器人收益不行,我对比很多个选择了“悦拜”这个平台,在手机上搜索“悦拜”,然后使用邀请码(778877)进行注册。

首先,我们需要导入所需的库。

# coding:utf-8

# 用于处理时间相关操作
import time
# 用于记录日志
from loguru import logger
# 用于多线程操作
import threading
# 用于微信相关功能
import itchat
# 用于正则表达式操作
import re
# 用于发送网络请求
import requests
# 用于base64编解码操作
import base64
# 用于处理日期和时间
import datetime
# 用于生成唯一标识符
import uuid
# 用于处理JSON数据
import json
# 用于与MySQL数据库交互
from mysqlClient import MysqlClient
# 导入配置信息
from config_report import *

然后,我们要梳理逻辑,创建两个表(用户表商品表)。
商品表如下:

# 商品表
createGoodsTable = '''CREATE TABLE If Not Exists `goodstable` (
  `nickName` varchar(255) DEFAULT NULL COMMENT '微信名字',
  `goodsName` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `url_tkl` varchar(255) DEFAULT NULL COMMENT '淘口令/下单链接',
  `returnMoney` varchar(255) DEFAULT NULL COMMENT '返利金额',
  `price` varchar(255) DEFAULT NULL COMMENT '原价',
  `specialPrice` decimal(10,2) DEFAULT NULL COMMENT '券后价',
  `orderStatus` varchar(255) DEFAULT NULL COMMENT '订单状态,0未付款,1已付款,2已结算,3已失效',
  `orderId` varchar(255) DEFAULT NULL COMMENT '订单号',
  `createTime` datetime DEFAULT NULL COMMENT '创建时间',
  `updateTime` datetime DEFAULT NULL COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;'''

用户表如下:

# 用户表
createUserTableSql = '''CREATE TABLE If Not Exists `usertable` (
  `nickName` varchar(255) NOT NULL COMMENT '微信名字',
  `returnMoney` varchar(255) DEFAULT NULL COMMENT '返利总金额',
  `iceMoney` varchar(255) DEFAULT NULL COMMENT '冻结金额',
  `createTime` datetime DEFAULT NULL COMMENT '创建时间',
  `withdrawalTime` varchar(255) DEFAULT NULL COMMENT '提现时间',
  PRIMARY KEY (`nickName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;'''

然后创建一个方法来查询是否有返利的商品,并确保返回的信息更加清晰易读。这里可以根据接口自己去写

#获取商品信息
def getInfo(site):
# 获取当前时间戳,用于 x-auth-timestamp 的值
timeStamp = getStamp()
# 将时间戳转换为随机数,用于 x-auth-random 的值
randomBase = str2base(timeStamp)
# 目标网站的API链接
url = 'https://app.jingxi.site/api/Goods/convertLink'
# 构建请求头部信息
header = {
'Accept': 'application/json, text/plain, /',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '200',
'Content-Type': 'application/x-www-form-urlencoded',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
'x-auth-random': randomBase,
'x-auth-signature': str(uuid.uuid4()).replace('-', ''),
'x-auth-timestamp': timeStamp,
'Host': 'app.jingxi.site',
'Origin': 'http://www.yuebai.co',
'Referer': 'http://www.yuebai.co/',
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"'

}

# 构建请求数据
data = {
    'invitation': 'DHPIHT',
    'content': site,
    'convert_type': '0'
}

try:
    # 发起POST请求
    response = requests.post(url, headers=header, data=data)
except Exception as e:
    # 处理请求异常
    monitor(f'请求故障,请联系管理员查看机器人是否故障,报错:{e}')
    logger.error(f'请求故障,请联系管理员查看机器人是否故障,报错:{e}')

try:
    # 解析响应数据
    html = json.loads(response.text)
    # 商品名称
    tradeName = html['data']['goods'][0]['goods_title']
    # 下单链接或淘口令
    if 'http' not in html['data']['content']:
        selfUrl = str(html['data']['content']).replace('/', '¥')
    else:
        selfUrl = html['data']['content']
    # 返利金额
    rebateMoney = str(round(float(html['data']['goods'][0]['pre_commission']) / 2, 2))
    # 原价
    originalMoney = html['data']['goods'][0]['price']
    # 券后价格
    discountMoney = html['data']['goods'][0]['after_coupon_price']
except Exception as e:
    # 处理解析异常
    return '该宝贝目前暂无返利!!!'

# 构建返回信息
if 'http' not in selfUrl:
    info = '#######################' + '\n' + '商品名称:' + tradeName + '\n' + '口令:' + selfUrl + '\n' + '返利金额:' + rebateMoney + '元' + '\n' + '原    价:' + originalMoney + '元' + '\n' + '券后价格:' + discountMoney + '元' + '\n' + '#######################\n复制整段话打开淘宝/抖音' + '\n' + '【返利步骤】\n1.淘宝/拼多多/京东/抖音链接发送给我\n2.点击返回的链接并下单\n3.到货确认收货后发起提现即可\n\n回复"返利",查看提现金额和冻结金额\n回复"提现",进行提现(微信转账)'
else:
    info = '#######################' + '\n' + '商品名称:' + tradeName + '\n' + '下单链接:' + selfUrl + '\n' + '返利金额:' + rebateMoney + '元' + '\n' + '原    价:' + originalMoney + '元' + '\n' + '券后价格:' + discountMoney + '元' + '\n' + '#######################' + '\n' + '【返利步骤】\n1.淘宝/拼多多/京东链接发送给我\n2.点击返回的链接并下单\n3.到货确认收货后发起提现即可\n\n回复"返利",查看提现金额和冻结金额\n回复"提现",进行提现(微信转账)'

return info, tradeName, selfUrl, rebateMoney, originalMoney, discountMoney

当客户通过您提供的链接下单后,通常需要追踪订单信息。以下是一个追踪订单信息的方法:

def get_order_info(x_auth_token):
    """
    获取已付款、已结算和已失效订单信息,并返回三个列表,格式为[[商品名称,订单号],[商品名称,订单号],[商品名称,订单号]]
    """
    # 获取当前时间戳作为 x-auth-timestamp 的值
    timestamp = get_timestamp()
    # 将时间戳转换为 x-auth-random 的值
    random_base = str_to_base(timestamp)
    
    url = 'https://app.yuebuy.cn/api/order/search'
    
    headers = {
        'Host': 'app.yuebuy.cn',
        'push-token': '191e35f7e0a8884bb78',
        'User-Agent': 'YueBuy/4.1.2 (iPhone; iOS 14.5; Scale/2.00)',
        'Content-Encoding': 'gzip',
        'x-auth-timestamp': timestamp,
        'x-auth-random': random_base,
        'system': '14.5',
        'version': 'v1',
        'x-auth-signature': str(uuid.uuid4()).replace('-', ''),
        'x-auth-token': x_auth_token,
        'Content-Length': '56',
        'platform': 'iOS',
        'Connection': 'keep-alive',
        'Accept-Language': 'zh-Hans-CN;q=1',
        'model': 'iPhone XR',
        'Accept': '*/*',
        'Content-Type': 'application/x-www-form-urlencoded',
        'app': '4.1.2',
        'idfa': '00000000-0000-0000-0000-000000000000'
    }
    
    data = {
        'date': 90,
        'page': 1,
        'page_size': 10000,
        'page_source': 'list',
        'scroll_id': '',
        'status': ''
    }
    
    response = requests.post(url, headers=headers, data=data)
    result = json.loads(response.text)

    paid_list = []     # 已付款列表
    settled_list = []  # 已结算列表
    expired_list = []  # 已失效列表
    
    try:
        for item in result['data']['data']:
            if item['status_name'] == '已付款!':
                paid_list.append([item['goods_title'], item['order_id']])
            if item['status_name'] == '已结算!':
                settled_list.append([item['goods_title'], item['order_id']])
            if item['status_name'] == '已失效!':
                expired_list.append([item['goods_title'], item['order_id']])
    except Exception as e:
        monitor(f'token可能失效,报错:{e}')
        logger.error(f'token可能失效,报错:{e}')
    
    return paid_list, settled_list, expired_list

在追踪到订单信息后,需要更新两个数据表的内容。方法如下:

# 定期更新goods表中的订单状态
def updateGoodsTable(status=0):
    while True:
        try:
            # 计算距离下次更新的时间间隔
            current_time = int(time.time())
            sleep_time = goodsTableTime - current_time % goodsTableTime
            logger.info(f'等待{sleep_time}秒后更新数据表goodsTable...')
            # time.sleep(sleep_time)  # 暂停直到下次更新周期

            # 获取订单信息
            paidList, settledList, expiredList = getOderInfo()

            # 更新已付款订单状态
            for paidItem in paidList:
                updateGoods2table('1', paidItem[1], paidItem[0])

            # 更新已结算订单状态
            for settledItem in settledList:
                updateGoods2table('2', settledItem[1], settledItem[0])

            # 更新已失效订单状态
            for expiredItem in expiredList:
                updateGoods2table('3', expiredItem[1], expiredItem[0])

            # 根据status标志判断是否退出循环
            if status:
                print('2323')
                break
            else:
                time.sleep(sleep_time)  # 等待下一周期
        except Exception as e:
            logger.error(f'报错:{e}')
            continue
# 定期更新userTable表中的数据,更新返利总额和冻结金额
def updateUserTable(status=0):
    while True:
        try:
            # 计算距离下次更新的时间间隔
            current_time = int(time.time())
            sleep_time = userTableTime - (current_time % userTableTime)
            logger.info(f'等待{sleep_time}秒后更新数据表userTable...')
            # time.sleep(sleep_time)  # 等待到下次更新周期

            # 获取所有客户的微信昵称列表
            allUserList = []
            user_records = mysql_client.select('SELECT nickName FROM usertable;')
            for user in user_records:
                allUserList.append(user['nickName'])  # 添加微信昵称到列表

            # 遍历所有客户,更新他们的返利和冻结金额
            for user in allUserList:
                # 查询冻结的返利总额
                select_freezed_sql = f'''
                    SELECT SUM(returnMoney) AS freezedMoney 
                    FROM goodstable 
                    WHERE nickName = "{user}" 
                      AND orderStatus = '1';
                '''
                # 查询已返利的总额
                select_returned_sql = f'''
                    SELECT SUM(returnMoney) AS returnMoney 
                    FROM goodstable 
                    WHERE nickName = "{user}" 
                      AND orderStatus = '2';
                '''

                # 获取冻结和返利金额
                freezed_result = mysql_client.select(select_freezed_sql)
                returned_result = mysql_client.select(select_returned_sql)
                
                freezedMoney = freezed_result[0]['freezedMoney']
                returnMoney = returned_result[0]['returnMoney']

                # 更新userTable中对应的客户记录
                update_sql = f'''
                    UPDATE usertable 
                    SET returnMoney = "{returnMoney}", iceMoney = "{freezedMoney}" 
                    WHERE nickName = "{user}";
                '''
                mysql_client.update(update_sql)  # 更新数据库

            # 根据status判断是否退出循环
            if status:
                print('3434')
                break
            else:
                time.sleep(sleep_time)  # 等待下一周期
        except Exception as e:
            logger.error(f'更新userTable出错,原因如下:{e}')  # 捕获异常并记录错误信息
            continue  # 继续下一个循环

我们计划创建一个微信机器人,因此我们需要使用itchat模块。尽管现在许多微信用户无法使用该模块,但我仍然可以使用itchat。因此,我决定利用微信作为机器人的平台。当然,我们也可以考虑其他平台,比如企业微信、钉钉等。

@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
    # 获取好友发送的消息内容
    content = msg['Content']
    # 从消息中匹配是否含有URL
    url = re.findall(r'http[s]?://(?:[a-za-z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fa-f][0-9a-f]))+', content)
    # 获取发送消息的微信昵称
    nickName = msg['User']['NickName']

    # 如果消息中包含URL且URL不包含'eyny.com'
    if len(url) != 0 and str(url[0]).find('eyny.com') == -1:
        # 若是新用户,则将其写入userTable表中
        insertUser2table(nickName)
        # 获取返利商品的信息
        try:
            result, tradeName, selfUrl, rebateMoney, originalMoney, discountMoney = getInfo(url[0])
            logger.info(f'{nickName}:{result}')
            # 将每次客户查询的订单信息写入goodstable数据表中
            insertGoods2table(nickName, tradeName, selfUrl, rebateMoney, originalMoney, discountMoney)
        except:
            return '该宝贝目前暂无返利!!!'
        # 返回查询结果
        return result

if __name__ == "__main__":
    logger.add('bot.log')
    itchat.auto_login(hotReload=True)

返利微信机器人的基本逻辑如上所示。我们可以进一步优化,添加一个邮件报警功能。这样,一旦机器人出现故障,我们可以在第一时间收到通知,减少损失。这个功能可以通过 yagmail 模块来实现。

# 监控模块
def monitor(content):
    # 初始化 yagmail 实例
    yag = yagmail.SMTP(user="344326300@qq.com", password="你的授权码", host='smtp.qq.com')
    # 发送邮件
    yag.send(
        # 收件人,可用字符串表示单个收件人,列表表示多个收件人
        to='XXXXXXXX@qq.com',
        # 邮件主题
        subject='报警机器人发生故障',
        # 邮件正文内容
        contents=content,
    )
    # 关闭连接,避免资源浪费

我购买了一台服务器,在云服务器上购买了上搭建了Python环境,现在只需将其挂起来,就可以开始经营了。
刚开始入门的伙伴也可以自己电脑上充当服务器,接下来,让我们看看效果如何。
优化过代码后可以自己修改返回的文案,大致是这样
在这里插入图片描述

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值