自動化篇 - 躺着收錢!閒魚自動發貨機器人來啦~

自動化篇 - 躺着收錢!閒魚自動發貨機器人來啦~

1


目 標 場 景

閒魚上,不少賣家選擇在平臺上賣虛擬商品,大部分虛擬商品的交易方式都是經過網盤連接來完成交易。node

在不少時候,商品被買家拍下並付款後,都須要一段時間的等待,一直到賣家看到消息後才能完成發貨,這樣顯得商品的交易效率很低下。android

那能不能作到「自動發貨、自動上新」,全程自動化操做發貨呢?答案是確定的。web

自動化篇 - 躺着收錢!閒魚自動發貨機器人來啦~
本篇文章的目的是爲閒魚定製一個「自動發貨機器人」,實現商品自動發貨的功能。ide

2


編 寫 代 碼

上篇文章 已經實現了消息自動回覆的功能,本篇文章將繼續在這個基礎之上去實現自動發貨機器人的功能。code

首先,咱們須要根據聊天界面,對訂單的狀態進行分類。orm

自動化篇 - 躺着收錢!閒魚自動發貨機器人來啦~

閒魚中一個商品的訂單狀態包含:交易前、等待買家付款、等待賣家發貨、退款等多種狀態。blog

這裏,咱們只須要把交易前和等待賣家發貨兩種狀態給篩選出來。遞歸

/***
 * 判斷訂單的狀態
 */
public static int getOrderStatus(AccessibilityNodeInfo node)
{
    List<AccessibilityNodeInfo> 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<AccessibilityNodeInfo> center_node = node.findAccessibilityNodeInfosByViewId(Ids.id_center_title);

    List<AccessibilityNodeInfo> 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 -

相關文章
相關標籤/搜索