闲鱼自动发货工具_躺着收钱!自动发货机器人来啦~

第三届易观算法大赛正在进行,预测流量赢3万奖金。同时分享Python内存分配秘密,140种Python库大全,爬虫实战,Python后台高并发优化,以及名企面试题解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

d8364e163ca4683ab9a0fa6ae119c8dc.png

作者 | 星安果    出自 | AirPython(ID:AirPython) 1.目标场景 闲鱼上,很多卖家选择在平台上卖虚拟商品,大部分虚拟商品的交易方式都是通过网盘链接来完成交易。 在很多时候,商品被买家拍下并付款后,都需要一段时间的等待,一直到卖家看到消息后才能完成发货,这样显得商品的交易效率很低下。 那能不能做到「自动发货、自动上新」,全程自动化操作发货呢?答案是肯定的。 4000b032f0e4eda1d398c57d1a157575.png 本篇文章的目的是为闲鱼定制一个「自动发货机器人」,实现商品自动发货的功能。 2.编写代码 上篇文章  已经实现了消息自动回复的功能,本篇文章将继续在这个基础之上去实现自动发货机器人的功能。 首先,我们需要根据聊天界面,对订单的状态进行分类。 dc98348a11d2ba45651c0abcf2252365.png 闲鱼中一个商品的订单状态包含:交易前、等待买家付款、等待卖家发货、退款等多种状态。 这里,我们只需要把交易前和等待卖家发货两种状态给筛选出来。
/*** * 判断订单的状态 */public static int getOrderStatus(AccessibilityNodeInfo node){    List status_nodes = node.findAccessibilityNodeInfosByViewId(Ids.id_order_status);    int status = 0;    if (null == status_nodes || 0 == status_nodes.size())    {        status = -1;    } else    {        AccessibilityNodeInfo first_node = status_nodes.get(0);        String status_content = first_node.getText().toString();        //交易前的普通对话        if (TextUtils.equals("交易前聊一聊", status_content))        {             status = 0;        } else if (TextUtils.equals("等待卖家发货", status_content))        {             status = 1;        } else if (TextUtils.equals("等待买家付款", status_content))        {             status = 2;        } else        {             status = 3;        }     }     return status;}
然后编写 UI 界面,将发货链接地址输入到输入框内,点击保存,保存到本地内存中。
//输入发货内容,比如网盘地址String content = delivery_rebot_content_et.getEditableText().toString().trim();if (TextUtils.isEmpty(content)){    SnackbarUtils.Short(delivery_rebot_set_content_btn, "请先输入要发货的内容").show();} else{    SettingConfig.getInstance().setAutoDeliverContent(content);                    delivery_rebot_content_et.getEditableText().clear();                    SnackbarUtils.Long(delivery_rebot_set_content_btn, "设置发货成功!!!").show();}
当判断当前页面是聊天界面,并且订单状态是「等待卖家发货」时,就从内存中读取数据,将网盘链接地址以消息的形式发送给买家。
//卖家已拍下,自动发货//发货的内容,一般是网盘地址String content = SettingConfig.getInstance().getAutoDeliverContent();//回复内容reply_content(event, content);
发完消息后,接着查找右上角的「去发货」元素,执行点击操作,模拟去发货。 2891bbd846e162a606c4fd0ada8b1a05.png 监听到到达「发货界面」的事件之后,查找右上角的「无需寄件」元素,再进行一次点击操作。
//发货界面 Activitypublic static String class_name_deliver = "com.taobao.idlefish.webview.WebHybridActivity";/*** * 判断是否是发货界面 */public static boolean judgeIsDeliverPage(AccessibilityNodeInfo node){    boolean result = false;    List center_node = node.findAccessibilityNodeInfosByViewId(Ids.id_center_title);    List right_node = node.findAccessibilityNodeInfosByViewId(Ids.id_right_up);    if (center_node != null && right_node != null && center_node.size() > 0 && right_node.size() > 0 &&                center_node.get(0).getText().equals("我要发货") && right_node.get(0).getText().equals("无需寄件")        )    {            result = true;    }    return result;}/*** * 发货界面处理 * @param event */private void handleDeliverMet(AccessibilityEvent event){    AccessibilityNodeInfo rightNode = findViewByIDAndText(Ids.id_right_up, "无需寄件");    performViewClick(rightNode);}
通过上面的操作,会弹出一个用于确认发货的对话框。 167b7afbc4e0c9e3fbf95816bbe53489.png 我们接着使用 Android Monitor 查看当前页面的元素信息,发现这个页面除了标题栏,内容区都包含在一个「WebView」里面。 243bf225560319511ad20f8ba8b89009.png 由于元素包含在 WebView 里,如果直接利用上面的方式查找对话框中的「文本内容为继续」的按钮元素是获取不到的。 这里需要对配置文件进行修改,增加一个「flags」的属性,保证能获取到当前页面包含 Web 元素的所有元素内容。
@Overrideprotected void onServiceConnected(){    super.onServiceConnected();    AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo();    serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;    serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;    serviceInfo.packageNames = new String[]{"com.taobao.idlefish"};    serviceInfo.notificationTimeout = 100;    //保证能够获取到Web元素    serviceInfo.flags = serviceInfo.flags | AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;    setServiceInfo(serviceInfo);}
然后先获取到 WebView 元素,再遍历查找筛选其子元素。
/*** * 查找WebView的控件,如果找到,执行点击操作 * @param content */public void findWebViewByTextAndClick(String content){    AccessibilityNodeInfo rootNode = findViewByID(Ids.id_webview_root);    if (rootNode != null)    {        for (int i = 0; i < rootNode.getChildCount(); i++)        {            AccessibilityNodeInfo child = rootNode.getChild(i);            if ("com.uc.webview.export.WebView".contentEquals(child.getClassName()))            {                findEveryViewNode(child, content);                break;            }         }     } else     {            Log.e("xag", "webview rootview is null");     }}
当查找到一个元素文本内容为确定,并且元素「可点击」,就执行点击操作,即完成了当前商品发货的操作。
private void findEveryViewNode(AccessibilityNodeInfo node, String content){    if (null != node && node.getChildCount() > 0)    {        for (int i = 0; i < node.getChildCount(); i++)        {            AccessibilityNodeInfo child = node.getChild(i);            // 有时 child 为空            if (child == null)            {                continue;            }            String className = child.getClassName().toString();            CharSequence text_raw = child.getText();            if ("android.view.View".equals(className) && !TextUtils.isEmpty(text_raw))            {                boolean isClickable = child.isClickable();                Log.e("xxx", "内容是:" + text_raw.toString());                //isClickable:可点击的按钮,按钮内容是继续                if (isClickable && TextUtils.equals(content, text_raw.toString()))                {                   child.performAction(AccessibilityNodeInfo.ACTION_CLICK);                   break;                }             }             // 递归调用             findEveryViewNode(child, content);          }       }}
3.结果结论 完成发货之后,执行全局返回的操作,直到页面重新回到闲鱼主界面为止。 当然,也可以在发货完成之后,点击这个商品的重新编辑按钮,修改后再次发布商品,这样就可以实现一件商品「 自动发货、自动上新 」的循环操作。 (*本文为Python大本营转载文章,转载请联系原作者,原文标题:自动化篇:躺着收钱!闲鱼自动发货机器人来啦~)

精彩推荐

由易观携手CSDN联合主办的第三届易观算法大赛正在火热进行中!冠军奖3万元,每人最多邀请5位用户组队参赛。本次比赛主要预测访问平台的相关事件的PV,UV流量(包括Web端,移动端等),大赛将会提供相应事件的流量数据,以及对应时间段内的所有事件明细表和用户属性表等数据,进行模型训练,并用训练好的模型预测规定日期范围内的事件流量。

d8364e163ca4683ab9a0fa6ae119c8dc.png

推荐阅读

  • Python内存分配时的小秘密

  • 吐血整理!140种Python标准库、第三方库和外部工具都有了

  • 如何用爬虫技术帮助孩子秒到心仪的幼儿园(基础篇)

  • Python传奇:30年崛起之路

  • 干货 | Python后台开发的高并发场景优化解决方案

  • 2019年最新华为、BAT、美团、头条、滴滴面试题目及答案汇总

  • 阿里巴巴杨群:高并发场景下Python的性能挑战

90e19de6f9ed75fcefd02c5b6392b5b4.png 你点的每个“在看”,我都认真当成了喜欢
<think>好的,我现在需要帮助用户了解中的_m_h5_tk参数的用途和生成方法。首先,我得回忆一下之前用户提供的引用内容,特别是引用[2]和[4],里面提到了这个参数是cookie中的一部分,用于生成sign值,而sign值用于请求的签名验证。 首先,确定用途。根据引用[2],_m_h5_tk是作为d.token参数参与sign值的生成,而sign值用于接口请求时的签名,可能是为了防止CSRF攻击或者确保请求的合法性。另外,引用[4]提到sign值是通过字符串拼接后加密得到的,猜测_m_h5_tk可能是一个动态令牌,用来增加签名的复杂性,防止重放攻击。 然后是生成方法。引用[2]提到这个参数在cookie中存在,并且会定时失效,这说明它可能由服务器生成并下发到客户端。通常这类参数可能包含时间戳、用户会话信息等,结合服务器端的密钥进行哈希生成。用户可能需要通过模拟登录或者保持会话来获取这个参数,但由于其定时失效,可能需要定期更新。 另外,引用[4]中讨论了sign的生成涉及多个参数,包括时间戳、appkey等,而_m_h5_tk作为其中一个参数,可能与其他参数拼接后进行MD5或其他加密算法处理。需要注意的是,生成sign的具体方法可能需要逆向分析JavaScript代码,找到加密函数的位置,如引用[4]提到的i函数。 用户可能需要具体的生成步骤,比如如何从cookie中获取_m_h5_tk,如何拼接参数,使用哪种加密算法等。不过,由于的反爬机制较强,直接逆向可能会遇到混淆或加密的代码,需要耐心分析。 总结下来,回答应包括用途和生成方法两部分,结合引用中的信息,说明_m_h5_tk在签名中的作用,生成方式涉及服务器下发,动态更新,以及参与加密的过程。同时提醒用户注意参数的有效期和反爬措施。</think>关于$_m_h5_tk$参数的用途及生成方法,结合技术实现分析如下: ### 一、$_m_h5_tk$核心用途 1. **接口签名验证**:作为生成签名(sign)的核心参数之一,用于校验请求合法性[^2][^4] 2. **身份会话标识**:包含用户登录态信息,与cookie中的其他参数共同维持会话状态[^2] 3. **动态安全校验**:配合时间戳参数实现请求时效性验证,防止重放攻击[^2] ### 二、生成机制解析 根据逆向分析结果[^2]: 1. **服务器生成**:由服务端生成并下发给客户端 2. **组成结构**: $$\_m_h5_tk = \text{md5}(uid + \_m_h5_tk\_enc + timestamp)$$ 其中$\_m_h5_tk\_enc$为服务端加密密钥 3. **有效期**: - 默认有效期30分钟 - 超过有效期需重新登录获取[^2] ### 三、技术实现要点 以Python实现为例: ```python def generate_sign(params, token): """ :param params: 请求参数字典 :param token: 从cookie获取的_m_h5_tk :return: 加密后的sign值 """ # 参数拼接格式参考[^4] sign_str = f'{token}_{params["appKey"]}_{params["t"]}_{params["data"]}' return hashlib.md5(sign_str.encode()).hexdigest() ``` ### 四、维护注意事项 1. **定时刷新机制**:需实现cookie自动续期 2. **分布式存储**:多节点爬虫需共享会话状态 3. **异常处理**:捕获`401`响应及时重新认证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值