Hướng dẫn viết Plugin All1Tool từ A tới Z

woaini1991

Hero
Verified
Joined
Mar 27, 2011
Messages
2,249
Reactions
2,182
MR
0.000
Xin chào mọi người,

Với mong muốn ai cũng có thể viết plugin cho All1Tool, mình làm hướng dẫn này mong giúp anh em có thể viết plugin cho tất cả các site Custom đã và sẽ có. Bài viết dưới dạng TUTORIAL, step-by-step, mọi người chỉ cần làm theo form là có thể viết được đa số các site.
Bài viết là mình chia sẻ kinh nghiệm của mình trong suốt quá trình viết plugin, đôi khi nó cũng không phải là cách tối ưu nhất để giải quyết 1 vấn đề nên bạn nào có cách hay hơn các bạn cứ góp ý để mình hoàn thiện nhé.

Bài 3. CLICK HERE

Bài 2. CLICK HERE


Bài 1. Giới thiệu

Trước khi đọc loạt bài viết của mình, bạn nên đọc qua bài viết từ anh Nhã nhé: http://nhabuiduc.wordpress.com/

I. Công cụ
Nếu chưa cài thì các bạn cứ cài trước đi nhé!
1. Visual Studio
- Mình đang dùng bản VS2010 Ultimate, các bạn có thể dùng bản nào bạn thích
- Link download VS2010 Ultimate (có Key): http://cosmospham.wordpress.com/201...oft-visual-studio-2010-iso-full-serial-crack/

2. Fiddler
- Win7-: Fiddler2
- Win8+: Fiddler4
Link: http://www.telerik.com/download/fiddler

II. Lý thuyết: Viết Plugin - Công việc cụ thể là gì?
Như các bạn đã biết, nếu click trực tiếp trên site thì các bạn phải làm một số bước sau:
1. Đăng nhập, bao gồm cả bước nhập captcha nếu có.
2. Sau khi đăng nhập thành công, tới link xem quảng cáo để click quảng cáo, bao gồm cả bước nhập captcha nếu có.
3. Đợi đếm ngược rồi lại click các quảng cáo tiếp theo
... và cứ lặp đi lặp lại cho tới khi hết quảng cáo.

Plugin nó sẽ làm thay bạn những công việc lặp đi lặp lại đó, bao gồm:
1. Đăng nhập (hiển thi captcha đăng nhập).
2. Lấy danh sách quảng cáo.
3. Xem quảng cáo (hiển thị captcha xác nhận).
4. Kết thúc.

Với những site có captcha đăng nhập, captcha xác nhận sau mỗi quảng cáo, thì phải có thêm bước hiển thị captcha yêu cầu người dùng nhập vào. Đôi khi có những captcha có thể vượt được thì viết hàm vượt captcha luôn trong code.

Câu hỏi đặt ra là làm thế nào Plugin làm được những công việc đó? Chúng ta biết là khi chúng ta làm bất cứ thao tác nào trên web, là chúng ta đang thực hiện một request trên web đó (sâu hơn nữa thì các bạn tự tìm hiểu nhé, mình cũng biết vậy thôi :v). Có 2 dạng request cơ bản là: GET POST. Nôm na thì GET đơn thuần là lấy dữ liệu từ server về, còn POST là có cả gửi dữ liệu lên server để thực hiện một yêu cầu nào đó. Ví dụ khi đăng nhập vào site A, thì không thể là GET được, mà lúc đó sẽ phải là POST để gửi thông tin username, password lên server yêu cầu server kiểm tra, nếu đúng nó sẽ đăng nhập bạn vào site.

Đó là đăng nhập, còn xem quảng cáo, lấy số tiền, download captcha ... cũng tương tự như vậy. 1 plugin thì quan trọng nhất là các request GET và POST. Một phần quan trọng nữa là xử lý HTML, xử lý String. Mình sẽ nói rõ hơn trong các bài sau.

OK, tạm thời thế đã bài sau mình sẽ demo một plugin đơn giản để các bạn hình dung qua một plugin cần viết những gì, những bài tiếp theo sẽ đi sâu vào từng phần cụ thể.
 
Last edited:

khoa02061986

Senior
Joined
Jul 5, 2013
Messages
427
Reactions
282
MR
0.000
Follow me on Facebook Chat with me via Skype
chỉ biết ấn nút like, like rất mạnh ko có nút, nên đành đợi ra nút đóa dzị :D
 
còn muốn vượt capt thì sao hả bác? thank bác đã hướng dẫn
Mình mới biết vượt:
- Captcha đếm sao ở các site Nga + Captcha Script Evolution (2 cái này tool hỗ trợ sẵn)
- Captcha là số, ký tự nhưng viết ngang ngang theo 1 form dễ nhìn
Còn lại là không vượt được nhé, chưa có time ngâm cứu :D

cái này rất quan trọng nè , viết mà ko vượt captcha thì coi như ko rồi
Nhiều bạn chỉ cần viết được để nhập captcha vào đó :) Không phải gì chứ cậu nghĩ vượt capt dễ vậy à :(
 
Bài 2: Giới thiệu qua cấu trúc 1 Plugin

Bài này giới thiệu qua về cấu trúc 1 Plugin đơn giản, nên các bạn chưa cần biết phải tạo project thế nào, add các references nào, ...

O. Cấu trúc cơ bản của 1 file Plugin
1. Hàm Begin (bắt buộc phải có)
public override All1ActionResult Begin(object arg)
{
// Code here
return new All1NextMethodResult { NextMethod = HamTiepTheo };
}

2. Các hàm hỗ trợ (không bắt buộc)
- Login
- Lấy list ads
- View ads
- Lấy amount
- Hiển thị captcha
...

3. Hàm End (bắt buộc phải có)
public override All1ActionResult End(object arg)
{
// Code here
return new All1ActionResult { Message = "Finish" };
}

I. Đăng nhập
1. Đăng nhập trên trình duyệt và theo dõi các request
2. Viết code đăng nhập bằng tool từ request thu được từ trên => làm lại sao cho giống hệt request từ trên trình duyệt là ok

Sau bước này là bạn đã đăng nhập vào site bằng plugin. Tưởng tượng Plugin nó cũng sẽ giả lập 1 trình duyệt để thao tác như bạn thao tác trên trình duyệt thật :)

II. Lấy danh sách ads
Theo dõi trên trình duyệt trước (vào trình duyệt rồi abcxyz và theo dõi bằng fiddler)
1. Vào link chứa các ads trên trình duyệt
2. Theo dõi các link ads có dạng gì để viết code lấy list ads
2.1. Dùng Ctrl + U ở Chrome hoặc F12
2.2. Theo dõi các dường sub-link của ads (sẽ có tầm 16 ads)
3. Nên chú ý tới cả vấn đề lấy ads đã view và chưa view cho code tối ưu
=> Làm các bước trên bằng code
4. Vào link chứa ads
5. Lấy list ads theo những gì vừa quan sát => lưu vào 1 queue (hàng đợi).

OK, sau bước này là ta đã có list các ads ở trog 1 queue, debug thử nhé!

III. View ads
Thao tác quan trọng nhất trong bước này là lấy timer và theo dõi request trả lời server để 1 ads được trả tiền.

1. Vào link mỗi ads
2. Lấy timer (thời gian đếm ngược với mỗi ads)
- Bước này tùy vào tư duy mỗi người, đa số thì nó sẽ ở trong block có cụm từ timer, time, secs ... Như trong site này thì cũng do kinh nghiệm mà mình tìm được cách lấy timer.

3. Theo dõi request lên server để 1 ads được trả tiền => viết code theo

OK, tới bước này nó sẽ tự chạy hết tất cả ads tới khi nào hết thì nó sẽ chuyển tới hàm End

IV. Kết thúc
Thường ở bước này sẽ lấy số tiền để hiển thị lên tool và kết thúc.

Khi viết xong 1 plugin hoàn chỉnh, nó sẽ chạy như vậy. Như bình thường thì những request capture được là do ta thực hiện 1 request trên trình duyệt, nhưng ở đây tất cả thực hiện bằng plugin All1Tool

OK, bài sau mình sẽ đi chi tiết vào từng phần, nếu có câu hỏi gì các bạn cứ comment ở topic mình sẽ trả lời.

Thank all!

Code duebux
Code:
using AutoManager.Commons;
using AutoManager.Recognition.Russ;
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using AutoManager.Plugins;

namespace All1Group.DueBux
{

    [PluginInfo(PluginName = "[All1Group] DueBux")]
    [Export(typeof(All1PluginScript))]
    class DueBux : All1PluginScript
    {

        private Queue<string> _linkQueue;

        private string getGridChances(string inputStr, string leftSideStr)
        {
            Regex regex = new Regex(string.Format("{0}\\s*:\\s*([^,<]+)", leftSideStr)); //Chance(s) left: 13</span>
            Match m = regex.Match(inputStr);
            if (m.Groups.Count > 1)
            {
                return m.Groups[1].Value;
            }
            return null;
        }

        private string getVerLink(string inputStr, string leftSideStr)
        {
            Regex regex = new Regex(string.Format("{0}\\s*\"\\s*([^,\"]+)", leftSideStr));
            Match m = regex.Match(inputStr);
            if (m.Groups.Count > 1)
            {
                return m.Groups[1].Value;
            }
            return null;
        }

        // O. Begin
        public override All1ActionResult Begin(object arg)
        {
            Client.GetRequest("/");
            return new All1NextMethodResult { NextMethod = SubmitLogin };
        }

        // I. Đăng nhập
        private All1ActionResult SubmitLogin(object arg)
        {

            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("email", Username);
            dic.Add("pass", Password);

            // data: email=f17withlove%40gmail.com&pass=DoiPassRoi%3AP

            // sau đó gửi request, request thuộc loại POST
            Client.PostRequest("login.php", dic, Client.Host + "/login.php");

            // Trường hợp login fail thì quay lại hàm SubmitLogin
            if (!Client.ResponseStr.Contains("/logout.php")) //?i=lo&
            {
                return new All1NextMethodResult { NextMethod = SubmitLogin };
            }

            // Trường hợp login ok thì bắt đầu tới hàm lấy list ads
            else
            {
                return new All1NextMethodResult { NextMethod = GetAdsList };
            }
        }// OK vậy là Login xong, giở debug thử xem tool có login giống như trên web không

        // II. Lấy danh sách ads
        private All1ActionResult GetAdsList(object arg)
        {
            // 4. Vào link chứa ads
            Client.GetRequest("dash/index.php");

            // 5. Lấy list ads theo những gì vừa quan sát
            HtmlNodeCollection nodes = Client.ResponseDoc.DocumentNode.SelectNodes("//div[@id='addblock']"); //addblock
            _linkQueue = new Queue<string>();
            if (nodes != null)
            {
                foreach (HtmlNode node in nodes)
                {
                    // Ads đã view thì bỏ qua
                    if (node.OuterHtml.Contains("background:grey"))
                        continue;

                    // Lấy ads chưa view
                    else
                    {
                        if (!IsCheatLink(node.ParentNode.ParentNode.InnerText))
                        {
                            string url = node.Attributes["onclick"].Value;
                            // Xử lý html và string sẽ đi sâu vào ở các bài sau
                            _linkQueue.Enqueue("/dash/" + url.Replace("')", "").Replace("window.open('", ""));
                        }
                    }

                }
            }

            return new All1NextMethodResult { NextMethod = ProcessAdPage };
        }

        // III. View ads
        private All1ActionResult ProcessAdPage(object arg)
        {

            if (_linkQueue.Count <= 0)
            {
                return new All1NextMethodResult { NextMethod = End };
            }

            // 1. Vào link mỗi ads
            string currentAdLink = _linkQueue.Peek();
            Client.GetRequest(currentAdLink, Client.Host + "/dash/index.php"); //url:

            // 2. Lấy timer (thời gian đếm ngược với mỗi ads)
            string timerStr;
            if (Client.ResponseStr.Contains("270"))
                timerStr = "30";
            else if (Client.ResponseStr.Contains("90"))
                timerStr = "10";
            else
                timerStr = "30";

            // Lấy link verify ads để gửi request
            string verLink = getVerLink(Client.ResponseStr, "url: ");

            int timer = int.Parse(timerStr);

            return new All1WaitingAdResult
            {
                WaitingTime = timer,
                RemainAds = _linkQueue.Count,
                NextMethod = (o) =>
                {
                    // 3. Theo dõi request lên server để 1 ads được trả tiền => viết code theo
                    Client.GetRequest("dash/" + verLink, Client.ResponseFullUrl, true);
                    _linkQueue.Dequeue();
                    return new All1NextMethodResult { NextMethod = ProcessAdPage };
                }
            };

        }

        // Hàm view grid -> tạm bỏ qua
        private All1ActionResult GridViewing(object arg)
        {
            int gridLeft = 1;
            if (gridLeft <= 0)
            {
                return new All1NextMethodResult { NextMethod = GridViewing };
            }
            Random rd = new Random();
            Client.GetRequest("dash/play_grid.php", Client.Host + "/dash/play_grid.php");

            Client.GetRequest("dash/gridview.php?c=" + rd.Next(0, 20) + "&m=" + rd.Next(100, 600));
            string verLink = getVerLink(Client.ResponseStr, "url: ");
            try
            {
                gridLeft = int.Parse(getGridChances(Client.ResponseStr, "Chance\\(s\\) left").Trim());
            }
            catch
            {
                gridLeft--;
            }

            return new All1WaitingAdResult
            {
                WaitingTime = 5,
                RemainAds = _linkQueue.Count,
                NextMethod = (o) =>
                {
                    Client.GetRequest("dash/" + verLink, Client.ResponseFullUrl, true);
                    return new All1NextMethodResult { NextMethod = GridViewing };
                }
            };

        }

        // IV. Kết thúc
        public override All1ActionResult End(object arg)
        {
            Client.GetRequest("dash/");
            HtmlNode textNode = Client.ResponseDoc.DocumentNode.SelectSingleNode("//strong[@style='color:white']"); //addblock
            //color:white
            Amount = ParseHelper.GetAmount(textNode.InnerText.Trim().Replace("$", ""));
            return new All1ActionResult { Message = "Finish" };
        }
    }
}
 

tuanngoc

Banned
Joined
Dec 12, 2011
Messages
529
Reactions
81
MR
0.000
Bạn woaini hay quá , bạn mở cái tiêu đề này sẽ có nhiều cao thủ vào và phân tích giúp đỡ lẫn nhau , chắc chắn sẽ hoàn hảo cách vượt captcha tất cả các site luôn đó bạn à
 
dù đã cố hết sức nhưng phát hiện ra một sự thật là ko biết tí gì về C# thì sẽ ko làm được, em bị dính lỗi khi build thử để chạy, mừ ko hiểu tại seo:oops:
 

Announcements

Today's birthdays

Forum statistics

Threads
426,690
Messages
7,182,308
Members
179,061
Latest member
go99autos
Back
Top Bottom