python写闲鱼脚本_自动化篇 - 躺着收钱!闲鱼自动发货机器人来啦~
1
目 標(biāo) 場(chǎng) 景
閑魚上,很多賣家選擇在平臺(tái)上賣虛擬商品,大部分虛擬商品的交易方式都是通過網(wǎng)盤鏈接來完成交易。
在很多時(shí)候,商品被買家拍下并付款后,都需要一段時(shí)間的等待,一直到賣家看到消息后才能完成發(fā)貨,這樣顯得商品的交易效率很低下。
那能不能做到「自動(dòng)發(fā)貨、自動(dòng)上新」,全程自動(dòng)化操作發(fā)貨呢?答案是肯定的。
本篇文章的目的是為閑魚定制一個(gè)「自動(dòng)發(fā)貨機(jī)器人」,實(shí)現(xiàn)商品自動(dòng)發(fā)貨的功能。
2
編 寫 代 碼
上篇文章 已經(jīng)實(shí)現(xiàn)了消息自動(dòng)回復(fù)的功能,本篇文章將繼續(xù)在這個(gè)基礎(chǔ)之上去實(shí)現(xiàn)自動(dòng)發(fā)貨機(jī)器人的功能。
首先,我們需要根據(jù)聊天界面,對(duì)訂單的狀態(tài)進(jìn)行分類。
閑魚中一個(gè)商品的訂單狀態(tài)包含:交易前、等待買家付款、等待賣家發(fā)貨、退款等多種狀態(tài)。
這里,我們只需要把交易前和等待賣家發(fā)貨兩種狀態(tài)給篩選出來。
/***
* 判斷訂單的狀態(tài)
*/
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();
//交易前的普通對(duì)話
if (TextUtils.equals("交易前聊一聊", status_content))
{
status = 0;
} else if (TextUtils.equals("等待賣家發(fā)貨", status_content))
{
status = 1;
} else if (TextUtils.equals("等待買家付款", status_content))
{
status = 2;
} else
{
status = 3;
}
}
return status;
}
然后編寫 UI 界面,將發(fā)貨鏈接地址輸入到輸入框內(nèi),點(diǎn)擊保存,保存到本地內(nèi)存中。
//輸入發(fā)貨內(nèi)容,比如網(wǎng)盤地址
String content = delivery_rebot_content_et.getEditableText().toString().trim();
if (TextUtils.isEmpty(content))
{
SnackbarUtils.Short(delivery_rebot_set_content_btn, "請(qǐng)先輸入要發(fā)貨的內(nèi)容").show();
} else
{
SettingConfig.getInstance().setAutoDeliverContent(content);
delivery_rebot_content_et.getEditableText().clear();
SnackbarUtils.Long(delivery_rebot_set_content_btn, "設(shè)置發(fā)貨成功!!!").show();
}
當(dāng)判斷當(dāng)前頁面是聊天界面,并且訂單狀態(tài)是「等待賣家發(fā)貨」時(shí),就從內(nèi)存中讀取數(shù)據(jù),將網(wǎng)盤鏈接地址以消息的形式發(fā)送給買家。
//賣家已拍下,自動(dòng)發(fā)貨
//發(fā)貨的內(nèi)容,一般是網(wǎng)盤地址
String content = SettingConfig.getInstance().getAutoDeliverContent();
//回復(fù)內(nèi)容
reply_content(event, content);
發(fā)完消息后,接著查找右上角的「去發(fā)貨」元素,執(zhí)行點(diǎn)擊操作,模擬去發(fā)貨。
監(jiān)聽到到達(dá)「發(fā)貨界面」的事件之后,查找右上角的「無需寄件」元素,再進(jìn)行一次點(diǎn)擊操作。
//發(fā)貨界面 Activity
public static String class_name_deliver = "com.taobao.idlefish.webview.WebHybridActivity";
/***
* 判斷是否是發(fā)貨界面
*/
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("我要發(fā)貨") && right_node.get(0).getText().equals("無需寄件")
)
{
result = true;
}
return result;
}
/***
* 發(fā)貨界面處理
* @param event
*/
private void handleDeliverMet(AccessibilityEvent event)
{
AccessibilityNodeInfo rightNode = findViewByIDAndText(Ids.id_right_up, "無需寄件");
performViewClick(rightNode);
}
通過上面的操作,會(huì)彈出一個(gè)用于確認(rèn)發(fā)貨的對(duì)話框。
我們接著使用 Android Monitor 查看當(dāng)前頁面的元素信息,發(fā)現(xiàn)這個(gè)頁面除了標(biāo)題欄,內(nèi)容區(qū)都包含在一個(gè)「WebView」里面。
由于元素包含在 WebView 里,如果直接利用上面的方式查找對(duì)話框中的「文本內(nèi)容為繼續(xù)」的按鈕元素是獲取不到的。
這里需要對(duì)配置文件進(jìn)行修改,增加一個(gè)「flags」的屬性,保證能獲取到當(dāng)前頁面包含 Web 元素的所有元素內(nèi)容。
@Override
protected 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的控件,如果找到,執(zhí)行點(diǎn)擊操作
* @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");
}
}
當(dāng)查找到一個(gè)元素文本內(nèi)容為確定,并且元素「可點(diǎn)擊」,就執(zhí)行點(diǎn)擊操作,即完成了當(dāng)前商品發(fā)貨的操作。
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);
// 有時(shí) 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", "內(nèi)容是:" + text_raw.toString());
//isClickable:可點(diǎn)擊的按鈕,按鈕內(nèi)容是繼續(xù)
if (isClickable && TextUtils.equals(content, text_raw.toString()))
{
child.performAction(AccessibilityNodeInfo.ACTION_CLICK);
break;
}
}
// 遞歸調(diào)用
findEveryViewNode(child, content);
}
}
}
3
結(jié) 果 結(jié) 論
完成發(fā)貨之后,執(zhí)行全局返回的操作,直到頁面重新回到閑魚主界面為止。
當(dāng)然,也可以在發(fā)貨完成之后,點(diǎn)擊這個(gè)商品的重新編輯按鈕,修改后再次發(fā)布商品,這樣就可以實(shí)現(xiàn)一件商品「 自動(dòng)發(fā)貨、自動(dòng)上新」的循環(huán)操作。
我已經(jīng)將全部源碼上傳到后臺(tái)上,關(guān)注公眾號(hào)后回復(fù)「發(fā)貨機(jī)器人」即可獲得下載鏈接。
另外,我也整理一份正確運(yùn)營閑魚的思維導(dǎo)圖,有需要的可以回復(fù)「閑魚腦圖 」獲取。
如果你覺得文章還不錯(cuò),請(qǐng)大家點(diǎn)贊分享下。你的肯定是我最大的鼓勵(lì)和支持。
推薦閱讀:
自動(dòng)化篇 - 為閑魚制作一個(gè)客服機(jī)器人(上)
自動(dòng)化篇 - ***們使用的自動(dòng)化方案,很多人還不知道
THANDKS
-End -
總結(jié)
以上是生活随笔為你收集整理的python写闲鱼脚本_自动化篇 - 躺着收钱!闲鱼自动发货机器人来啦~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: IOS – OpenGL ES 图像柏林
- 下一篇: 时势造英雄,快影成长启示录