飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 14942|回复: 0

女朋友让我深夜十二点催她睡觉,我有Python我就不干

[复制链接]

7928

主题

8016

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26114
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
7 G3 I. Q, v( g4 L* z
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>, A7 V7 @- n+ u0 i; W# C) Y
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>' x9 `, D2 Y/ \# |5 K6 R+ w# J, z
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
; [$ |4 L8 }3 ^2 H<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>3 S: J. H, p) a+ O
但,女朋友的命令,我是不敢违抗的……<br>7 a! A# K% n2 j" m
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>+ i% o- q6 P1 I# k( `
但是睡觉也不能缺!</p>
# }1 |9 t, \. x3 ^0 e" |<p>这时候我们该怎么办呢?是时候让Python登场了!</p>7 I3 T( v8 t" a: G% m0 q# T
<h1 id="python登场">Python登场</h1>
1 A, N5 ?/ y7 f<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
  N0 t8 x, i8 }. d<h2 id="安装和导入">安装和导入</h2>5 d" x' m# v" i, S9 C; ~$ ^
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>- N4 A) f5 F# s% n0 ]
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
8 {' x; z0 I# d  H' E<pre><code class="language-p">pip install apscheduler
/ Z: x; L9 g$ v3 O3 l8 Rpip install pyautogui$ P' B8 V1 `) i7 z% Y! H$ \, w
</code></pre>2 h, ^. p3 B4 \- }+ Q) W! {
<p>导入:</p>
2 d3 U5 @3 C% l4 \<pre><code class="language-python">import pyautogui
- U4 o& v2 v, J  q7 Jfrom datetime import datetime
. l6 S2 m' @/ Z; M2 s5 Vfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
' J6 k7 f7 g* I  T: K3 E9 W7 \0 C# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
% O4 n& v3 k9 H4 M. }5 F# from apscheduler.schedulers.background import BackgroundScheduler- `; `. C  z8 B3 n
</code></pre>
( R1 `5 l! j3 g2 Q# r$ U+ k<h1 id="pyautogui">pyautogui</h1>
0 ^4 |8 Q. w2 |! V5 u2 Z2 \4 _<p>首先我们来实现自动发送消息</p>
8 r3 l: P) P; q* U5 u* r1 F' v<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
2 r( \( I" I; h! R<p>先来做一些基本设置:</p>
, r4 d6 Y9 |2 f" `; H7 I<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
* H' C0 d0 x9 s7 V</code></pre>
% o! g8 o, D, ~2 l, m<p>然后我们登录微信,最小化。</p>3 Y/ k3 l7 I2 Y( P& n3 A
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>  `1 f: g1 l  b8 ~- ~
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
/ `+ V3 g8 t! Hicon_position = pyautogui.position() # Point(x=148, y=879)( E$ F6 H- I* m' l% Y  n: Z1 s
</code></pre>
! n# t8 Q" B! K<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>+ J& d8 S% A6 r2 k0 a
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
" [8 h- Z- ^6 |7 U6 `* t" X<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751), m3 ~# }( ]: m3 T# @2 I
entry_position = pyautogui.position() # Point(x=174, y=751)! k6 m  t, f% O( |3 @$ Y
</code></pre>
% S0 [6 x9 t1 F<p>接下来,控制程序依次点击这两个点:</p>
2 u. ^- M6 h, i  O9 }' c<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击" P$ F3 s) ^$ D: f- |
# pyautogui.click(148, 879)
3 `8 i: L3 b( a4 v% ~& \pyautogui.click(entry_position). z4 I: Q/ ?# m8 V! \) N; }
# pyautogui.click(174, 751). E+ U. j( M) ~6 t. R" j% N  e
</code></pre>' b, f  ^5 V* s2 M0 [: F
<p>打开微信并锁定焦点后,我们开始输入文本。</p>
5 J0 p) O; t7 U1 I& I<p>输入文本可以有两种方式:</p>
3 H& `! m% z) I* v8 V/ [1 a5 L  m  c# a<ul>
; m7 Q) ]  J: w. z<li>
3 Z' X: @& ~& P7 V<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
# r6 R! f, T1 i; h<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>. ~5 I" n' y+ W3 V  K
</li>
+ @! w8 {) z! Q; ?7 K' z, X<li>! f6 [$ E$ X: C. e& u% v
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p># n2 p# _# z8 O; e! i8 L, D
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
) e2 [) E. |  f" g9 l; i</li>
7 `% x6 f3 N2 J6 e7 v</ul>
  j  ]' f7 G; D' ~<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>* ?0 ?0 t- w2 e6 [6 q
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间2 R! @" y4 A" d9 w# k" i# Y- H
</code></pre>" @) ~; `" O) N5 F& K' U( C- d
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
/ Q" E$ c* A& W. z- T! |, D<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选8 w* |( w3 d+ J2 b8 i
pyautogui.click(icon_position)
- ~2 o/ A9 H# m+ |& x4 ]+ spyautogui.moveTo(entry_position, duration=2)- a! E" `0 C0 H4 |" ?
pyautogui.click(entry_position)
) S; B+ A# j4 @) Opyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
3 g6 W9 o* m* o4 h: s</code></pre>. Z5 @' o9 O" T6 t9 W
<p>看看效果:<br>. g' z3 m% D8 L( H" I  i& f9 d( D  ]
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
& v: W) W1 f. D9 }* w4 i当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>; W7 }! W9 g1 k6 |
<pre><code class="language-python">import pyperclip/ q0 a2 }$ I0 q/ \% z

. k$ `) ~* W2 E5 A- I  ?+ Bpyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制$ `5 B# f" p; w! n! }# k
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴* x% v! }8 k# R
pyautogui.press('enter') # 按下按键0 G0 \' v1 y; }7 A1 \
</code></pre>
1 ~, t3 i( r) i( T* v, u* a<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
/ a+ q1 m) @+ k  u9 }这样,我们便完成了自动发送微信消息的功能了。</p># u7 v4 v1 r' j* K, R6 D
<h1 id="apscheduler">apscheduler</h1>
& s; m: d; ]% K; O; Y6 `) ?<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>2 }( t) _, K) f2 v) `9 ~
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器) ^# w) @  i: t* ?/ }
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务( }2 k1 i; u, x/ s7 L' K+ S
scheduler.start()- M! S, ~+ Z: ?* R( d
</code></pre>
1 j' y5 D! N9 Y! U. Y: I<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>1 K$ }" U  w- f6 y, R! b
<h1 id="完整代码">完整代码</h1>
6 O, h& |7 {% C<pre><code class="language-python">import pyautogui- H. C" C7 ^* e  \
import pyperclip9 a# M9 e2 a5 D0 |  w5 Q
from datetime import datetime
% g, i, X5 n: N" ]# q: t, ?from apscheduler.schedulers.blocking import BlockingScheduler7 H; J! z" p  p/ h" P& `8 z8 q
; {* f; P6 X! Q6 o
def main():
4 D3 V6 o; H2 B; F2 M- u        pyautogui.PAUSE = 0
% v* w0 ]" ?) t, M  s; U$ x. _/ ^8 `( A8 x1 n
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
' L8 @9 j0 l4 `" y% T" ^        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置  A1 c0 m+ n8 n! q) r. W
- f- t% ?2 X0 C* \
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
& L2 s' J9 R' d! x        pyautogui.click(icon_position)
1 L, r2 o8 n, J$ ]) p3 {        pyautogui.moveTo(entry_position, duration=0.7)
% p4 ~$ f  H6 ?1 `        pyautogui.click(entry_position), t1 T$ ]0 i# L7 ^3 _5 l
        pyperclip.copy('快去睡觉')8 m6 A3 H, ^" }  s& ]. K, w8 s/ _5 |
        pyautogui.hotkey('ctrl', 'v')
; k: z# }9 @( a# j$ N        pyautogui.press('enter'); |; i" @5 R0 I0 W6 n' D
    pyperclip.copy('笨猪')
+ H( f& [7 D9 ^+ z        pyautogui.hotkey('ctrl', 'v')
8 [& N5 t/ h  p9 x6 j0 ~        pyautogui.press('enter')
4 W/ o) J# o1 T6 z   
" ?% I$ x7 _. m5 r7 b% Lscheduler = BlockingScheduler() # 实例化: p! o( [( q. N0 a8 k' A
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务" B$ K  B5 l$ \
scheduler.start()
! G- k4 H3 F. K: {</code></pre>9 m  a0 B" E( w
<p>完成啦!现在可以去睡觉了。</p>
& ?% ^5 _0 Z# T2 r. U, Z6 Q' ~<h1 id="结果">结果</h1>7 n9 x6 r1 ~3 o3 [' ?& n5 v
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
$ }. F- G/ q; X0 U<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>$ K+ O: m2 R7 Z( j, _9 v" M
<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>; e" H2 N' V) i2 s1 R
<hr>
- r- P# S9 }1 h% |<h1 id="---the-end---">-- the End --</h1>
1 i5 E; y4 Z0 W" K<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>  o, s( p, K9 E8 k
<p>打个小广告:作者CSDN博客主页:<br>
$ `  L, n: |% \% e2 @7 A; L<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
* L( Q+ k9 B, X6 t1 |- M9 {
" {: r; S5 n2 h; G. Y$ U, B- T
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2025-11-22 12:37 , Processed in 0.065467 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表