python写闲鱼脚本_自动化篇 - 躺着收钱!闲鱼自动发货机器人来啦~
1
目 標 場 景
閑魚上,很多賣家選擇在平臺上賣虛擬商品,大部分虛擬商品的交易方式都是通過網盤鏈接來完成交易。
在很多時候,商品被買家拍下并付款后,都需要一段時間的等待,一直到賣家看到消息后才能完成發貨,這樣顯得商品的交易效率很低下。
那能不能做到「自動發貨、自動上新」,全程自動化操作發貨呢?答案是肯定的。
本篇文章的目的是為閑魚定制一個「自動發貨機器人」,實現商品自動發貨的功能。
2
編 寫 代 碼
上篇文章 已經實現了消息自動回復的功能,本篇文章將繼續在這個基礎之上去實現自動發貨機器人的功能。
首先,我們需要根據聊天界面,對訂單的狀態進行分類。
閑魚中一個商品的訂單狀態包含:交易前、等待買家付款、等待賣家發貨、退款等多種狀態。
這里,我們只需要把交易前和等待賣家發貨兩種狀態給篩選出來。
/***
* 判斷訂單的狀態
*/
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);
發完消息后,接著查找右上角的「去發貨」元素,執行點擊操作,模擬去發貨。
監聽到到達「發貨界面」的事件之后,查找右上角的「無需寄件」元素,再進行一次點擊操作。
//發貨界面 Activity
public 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);
}
通過上面的操作,會彈出一個用于確認發貨的對話框。
我們接著使用 Android Monitor 查看當前頁面的元素信息,發現這個頁面除了標題欄,內容區都包含在一個「WebView」里面。
由于元素包含在 WebView 里,如果直接利用上面的方式查找對話框中的「文本內容為繼續」的按鈕元素是獲取不到的。
這里需要對配置文件進行修改,增加一個「flags」的屬性,保證能獲取到當前頁面包含 Web 元素的所有元素內容。
@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的控件,如果找到,執行點擊操作
* @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
結 果 結 論
完成發貨之后,執行全局返回的操作,直到頁面重新回到閑魚主界面為止。
當然,也可以在發貨完成之后,點擊這個商品的重新編輯按鈕,修改后再次發布商品,這樣就可以實現一件商品「 自動發貨、自動上新」的循環操作。
我已經將全部源碼上傳到后臺上,關注公眾號后回復「發貨機器人」即可獲得下載鏈接。
另外,我也整理一份正確運營閑魚的思維導圖,有需要的可以回復「閑魚腦圖 」獲取。
如果你覺得文章還不錯,請大家點贊分享下。你的肯定是我最大的鼓勵和支持。
推薦閱讀:
自動化篇 - 為閑魚制作一個客服機器人(上)
自動化篇 - ***們使用的自動化方案,很多人還不知道
THANDKS
-End -
總結
以上是生活随笔為你收集整理的python写闲鱼脚本_自动化篇 - 躺着收钱!闲鱼自动发货机器人来啦~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS – OpenGL ES 图像柏林
- 下一篇: 时势造英雄,快影成长启示录