Python là một trong những ngôn ngữ mình thích sử dụng nhất. Lí do là vì python có nhiều thư viện hỗ trợ mạnh, gần như cần gì thì chỉ cần google là ra. Gần đây mình mới tìm được một thư viện khá hay ho của python hỗ trợ chúng ta trong việc điều khiển bàn phím và chuột. Đó là thư viện pynput.
Với pynput chúng ta có thể làm những tool như keylogger, làm cho bàn phím gõ loạn lên,… và nhiều thứ hay ho khác. Trong bài này chúng ta sẽ tìm hiểu về cách sử dụng pynput để điều khiển bàn phím.
1. Cài đặt
Với đa số máy tính thì chỉ cần gõ 1 lệnh thôi:
1 2 | pip <span class="token function">install</span> pynput |
Với python3:
1 2 | pip3 <span class="token function">install</span> pynput |
Trong trường hợp máy tính không cài đặt thư viện thì các bạn có thể sử dụng các IDE xịn như pycharm.
Với pycharm, sau khi tạo project các bạn vào file > Setting (Ctrl + Alt + S). Tại cửa sổ setting mở mục project ra, chọn phần Project Interpreter.
Ấn vào dấu + ở trên thanh dọc nằm ở phía bên phải cửa sổ. Tìm kiếm thư viện pynput và click Install Package. Chờ IDE tiến hành download và install xong là bạn có thể import pynput được rồi.
2. Ghi lại phím
Để ghi lại các phím được gõ chúng ta sẽ sử dụng pynput.keyboard.Listener như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">from</span> pynput <span class="token keyword">import</span> keyboard <span class="token keyword">def</span> <span class="token function">keyPressed</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># Do something ...</span> <span class="token keyword">def</span> <span class="token function">keyReleased</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># Do something ...</span> <span class="token keyword">if</span> key <span class="token operator">==</span> keyboard<span class="token punctuation">.</span>Key<span class="token punctuation">.</span>esc<span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token boolean">False</span> <span class="token comment"># Collect events until released</span> <span class="token keyword">with</span> keyboard<span class="token punctuation">.</span>Listener<span class="token punctuation">(</span> on_press <span class="token operator">=</span> keyPressed<span class="token punctuation">,</span> on_release <span class="token operator">=</span> keyReleased<span class="token punctuation">)</span> <span class="token keyword">as</span> listener<span class="token punctuation">:</span> listener<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">)</span> |
Các bạn có thể viết bất cứ gì trong 2 hàm keyPressed(key) và keyReleased(key): in ra phím được gõ, lưu lại phím được gõ,…
Để ngừng việc ghi phím lại có 3 cách:
- Trả về False trong keyPressed(key) hoặc keyReleased(key).
- Gọi phương thức pynput.keyboard.Listener.stop() ở bất cứ đâu.
- Gặp ngoại lệ StopException trong khi đang ghi phím.
Các bạn có thể viết bất cứ gì trong keyPressed(key) và keyReleased(key). Ví dụ như ghi lại danh sách các phím đã gõ, cùng với thời gian ghi nhận phím:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token keyword">from</span> pynput <span class="token keyword">import</span> keyboard <span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime logdata <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token keyword">def</span> <span class="token function">getKeyName</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> keyboard<span class="token punctuation">.</span>KeyCode<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> key<span class="token punctuation">.</span>char <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token builtin">str</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">keyPressed</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">:</span> keyName <span class="token operator">=</span> getKeyName<span class="token punctuation">(</span>key<span class="token punctuation">)</span> logdata<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token punctuation">[</span>datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>timestamp<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> keyName<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">keyReleased</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">if</span> key <span class="token operator">==</span> keyboard<span class="token punctuation">.</span>Key<span class="token punctuation">.</span>esc<span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span>logdata<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">False</span> <span class="token comment"># Collect events until released</span> <span class="token keyword">with</span> keyboard<span class="token punctuation">.</span>Listener<span class="token punctuation">(</span> on_press <span class="token operator">=</span> keyPressed<span class="token punctuation">,</span> on_release <span class="token operator">=</span> keyReleased<span class="token punctuation">)</span> <span class="token keyword">as</span> listener<span class="token punctuation">:</span> listener<span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token punctuation">)</span> |
3. Gõ phím theo file log
Trong trường hợp chúng ta có một file log phím khoảng vài trăm, vài nghìn dòng, hoặc nhiều hơn thế nữa thì có thể sử dụng pynput để máy tự gõ lại các phím trong file log. Đi uống cốc cà phê, hoặc làm ván cờ tự động rồi sau đó quay lại xem nội dung là gì :3
Để máy tự động gõ lại phím từ file log chúng ta sử dụng pynput.keyboard.Controller như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">from</span> pynput<span class="token punctuation">.</span>keyboard <span class="token keyword">import</span> Key<span class="token punctuation">,</span> Controller keyboard <span class="token operator">=</span> Controller<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># Press and release special key </span> keyboard<span class="token punctuation">.</span>press<span class="token punctuation">(</span>Key<span class="token punctuation">.</span>space<span class="token punctuation">)</span> keyboard<span class="token punctuation">.</span>release<span class="token punctuation">(</span>Key<span class="token punctuation">.</span>space<span class="token punctuation">)</span> <span class="token comment"># Press and release normal key </span> keyboard<span class="token punctuation">.</span>press<span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">)</span> keyboard<span class="token punctuation">.</span>release<span class="token punctuation">(</span><span class="token string">'a'</span><span class="token punctuation">)</span> <span class="token comment"># Press and release normal upper key </span> keyboard<span class="token punctuation">.</span>press<span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span> keyboard<span class="token punctuation">.</span>release<span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">)</span> |
Còn lại chỉ cần đọc file log là được, đơn giản hơn cả ghi lại phím đúng không.
Vừa rồi chỉ là cách sử dụng pynput để điều khiển phím đơn giản. Nếu muốn tự code tool keylogger hoặc keytroller để cài vào máy bạn bè trên tinh thần “hòa bình hữu nghị” thì còn phải tìm hiểu thêm nhiều cái nữa :v