Cách tự động hóa tương tác Instagram bằng thị giác máy tính (và bị khóa tài khoản)

12 tháng 6, 2026·7 phút đọc

Bài viết chia sẻ hành trình sử dụng thị giác máy tính để tự động hóa các thao tác trên Instagram mà không cần truy cập mã nguồn. Mặc dù thuật toán phát hiện hình ảnh hoạt động chính xác, tài khoản dùng thử vẫn bị khóa nhanh chóng do hệ thống chống bot hiệu quả của nền tảng.

Rõ ràng là Instagram không muốn bạn tự động hóa các tương tác trên nền tảng của họ. Mã HTML của trang web này là một mớ hỗn độn với các tên class được tạo ngẫu nhiên và các thẻ div lồng nhau sâu đến mức khó tin. Cấu trúc này thay đổi sau mỗi lần triển khai. Bất kỳ tập lệnh nào dựa vào bộ chọn DOM (DOM selectors) sẽ bị hỏng trong vòng vài tuần vì tên class đó không còn tồn tại nữa.

Tuy nhiên, điều đó cũng không quan trọng lắm. Instagram có thể làm rối mã code của họ bao nhiêu tùy thích vì code là dành cho máy móc. Nhưng giao diện người dùng (UI)... thì dành cho con người. Biểu tượng trái tim phải trông giống như một trái tim. Nút bình luận phải nằm ở nơi người dùng mong đợi. Bố cục phải đủ nhất quán để một người có thể dễ dàng điều hướng.

Vì vậy, thay vì đấu tranh với DOM, hãy bỏ qua nó hoàn toàn. Chụp ảnh màn hình. Tìm trái tim dựa trên ngoại hình của nó. Lấy tọa độ của nó. Di chuyển con trỏ đến đó. Nhấp chuột. Xong.

Phương pháp này hoạt động trên bất kỳ thứ gì hiển thị dưới dạng điểm ảnh. Ứng dụng web, ứng dụng gốc, trò chơi, thiết bị đầu cuối. Nếu con người có thể nhìn thấy nó và nhấp vào nó, máy tính cũng có thể làm được. Không cần bộ chọn, không cần API, không cần móc nối đặc thù cho từng nền tảng. Chỉ cần thị giác máy tính và tự động hóa con trỏ.

Thách thức của việc hardcode vị trí

Thật không may, bạn không thể chỉ cần hardcode (lưu cứng) một vị trí. Mọi thứ di chuyển liên tục. Một chú thích (caption) dài sẽ đẩy thanh hành động xuống dưới. Thẻ địa điểm thêm một dòng. Băng chuyền hình ảnh chiếm nhiều không gian dọc hơn. Mỗi bài đăng nén hoặc mở rộng bố cục theo những cách khác nhau.

Hãy thử điều hướng giữa 2 bài đăng và xem điều gì xảy ra với vị trí của các trái tim: vị trí của chúng không bao giờ giống nhau.

Thị giác máy tính giải quyết vấn đề này. Thay vì đoán nơi các trái tim nên nằm, bạn nhìn vào màn hình và tìm nơi chúng thực sự ở đó.

Vấn đề: Quá nhiều màn hình, quá nhiều dương tính giả

Cách tiếp cận ngây thơ rất đơn giản: lấy biểu tượng trái tim làm mẫu và tìm nó trên màn hình. Bất cứ nơi nào nó khớp, đó là một trái tim. Đây là thao tác thị giác máy tính cơ bản nhất bạn có thể thực hiện.

Nhưng nó không hoạt động tốt lắm.

Một ảnh chụp màn hình đầy đủ rất lớn. Hơn 7 triệu điểm ảnh trên một màn hình điển hình. Trong khi đó, một trái tim lại rất nhỏ, khoảng 70x60 điểm ảnh. Đó là diện tích bề mặt khổng lồ để tìm kiếm. Trong biển điểm ảnh đó, có rất nhiều thứ trông giống một trái tim một cách mơ hồ. Bạn sẽ nhận được quá nhiều dương tính giả (báo động sai).

Kỹ thuật phát hiện thì ổn, nhưng không gian tìm kiếm mới là vấn đề. Màn hình đầy nhiễu. Bạn càng tìm kiếm nhiều diện tích, bạn càng tìm thấy nhiều nhiễu.

Thu hẹp không gian tìm kiếm

Giải pháp là ngừng tìm kiếm toàn bộ màn hình. Thay vào đó, hãy tìm những thứ trên màn hình dễ phát hiện và sử dụng chúng để xác định vị trí của các trái tim.

Trên Instagram, có hai thứ luôn dễ tìm thấy:

  • Menu ba chấm (⋯) ở góc trên bên phải của mọi bài đăng. Nó nhỏ, độ tương phản cao và có nét đặc trưng về mặt thị giác. Nó luôn hiện diện.
  • Thanh hành động (thích/bình luận/chia sẻ) ở dưới cùng của mọi bài đăng. Nó là một mô hình các biểu tượng rộng và dễ dự đoán.

Cả hai đều có thể được tìm thấy bằng khớp mẫu cơ bản trong vài mili-giây. Nhưng chúng ta không quan tâm đến chúng vì chính chúng. Chúng ta quan tâm đến những gì chúng cho chúng ta biết: menu ba chấm nằm ngay phía trên cột chứa các trái tim. Thanh hành động nằm ngay phía dưới nó. Nếu chúng ta biết vị trí của hai điểm mốc (landmarks) này, chúng ta biết chính xác các trái tim ở đâu. Chúng nằm trong dải thẳng đứng ở giữa chúng.

crop.x      = triple_dots.x
crop.y      = triple_dots.y + triple_dots.height
crop.width  = triple_dots.width
crop.height = action_bar.y - crop.y - action_bar.height x 0.2

Những thứ còn lại trong vùng tìm kiếm chỉ là các trái tim thực tế và bất cứ thứ gì tình cờ nằm trong cột chính xác đó.

Vì vùng cắt (crop region) được suy ra từ vị trí thực tế của các điểm mốc trên màn hình thay vì được hardcode, nó tự động thích ứng với mọi bài đăng. Các điểm mốc có thể cao hơn hoặc thấp hơn tùy thuộc vào nội dung bài đăng, nhưng mối quan hệ hình học giữa chúng và các trái tim luôn như nhau.

Cửa sổ trượt (Sliding Window)

Bây giờ không gian tìm kiếm đã nhỏ và sạch, bạn có thể chạy cửa sổ trượt. Lấy mẫu trái tim và trượt nó qua vùng tìm kiếm từng điểm ảnh một. Chấm điểm mỗi vị trí. Khớp càng tốt, khả năng đó là trái tim càng cao.

Cửa sổ trượt được thiết kế lỏng lẻo một cách có chủ đích để bắt được mọi trái tim có thể. Nhưng điều đó có nghĩa là nó cũng bắt được những thứ không phải là trái tim.

Các trái tim trên Instagram đều nằm trong một cột dọc. Mỗi cái một. Hầu hết các lần phát hiện sẽ nằm trên đường thẳng đó. Bất cứ thứ gì không nằm trên nó là một điểm bất thường:

Các trái tim (♡) cụm trên một tọa độ X. Các dương tính giả (✕) bị phân tán. Cửa sổ trượt nghĩ chúng có hình dạng giống trái tim, nhưng chúng không nằm trong cột đó.

Vì vậy, chúng ta tìm X phổ biến nhất trong số tất cả các lần phát hiện, đường đồng thuận, và loại bỏ bất cứ thứ gì cách xa hơn 10 điểm ảnh. Đó đơn giản là việc tìm mode (giá trị xuất hiện nhiều nhất) của các giá trị X và coi mọi thứ khác là nhiễu. Vài dòng code và gần như tất cả các dương tính giả biến mất. Cửa sổ trượt lỏng lẻo để bắt mọi trái tim có thể. Bộ lọc này chặt chẽ để loại bỏ mọi thứ không phải là trái tim.

Quy trình phát hiện hoàn chỉnh

  1. Chụp ảnh màn hình
  2. Tìm menu ba chấm và thanh hành động thông qua khớp mẫu
  3. Tính toán vùng cắt từ vị trí của chúng
  4. Cắt thành một dải rộng 60 điểm ảnh
  5. Chạy khớp mẫu cửa sổ trượt ở nhiều tỷ lệ khác nhau
  6. Bộ lọc căn chỉnh dọc
  7. Khử trùng lặp, sắp xếp từ trên xuống dưới
  8. Trả về [{x, y}, ...]

Mỗi trái tim được phát hiện trở thành một tọa độ nhấp chuột. Máy chủ trả về chúng dưới dạng JSON. Máy khách di chuyển con trỏ đến từng cái và nhấp.

Lệnh cấm

Tài khoản đã bị khóa trong vòng vài ngày.

Tôi đã thử một vài thứ để làm cho nó bớt rõ ràng hơn. Đường cong Bezier cho chuyển động con trỏ tự nhiên, thời gian nhấp chuột ngẫu nhiên, những cử chỉ nhỏ nhặt (fidgeting) giữa các hành động, độ lệch ngẫu nhiên trên nút theo dõi. Tất cả các mẹo thông thường.

Tất nhiên, nó không hoạt động. Instagram chi rất nhiều tiền cho việc phát hiện bot và đội ngũ của họ đang làm việc việc này toàn thời gian.

Nhưng thử nghiệm này vẫn thú vị. Bạn có thể hướng một chiếc camera vào bất kỳ màn hình nào và tương tác với nó chỉ bằng thị giác máy tính và tự động hóa con trỏ không? Câu trả lời là có.

Lưu ý: Nếu bạn chỉ muốn làm cho thứ gì đó hoạt động, hãy xem thử Oculix.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗