飞雪团队

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

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

[复制链接]

8042

主题

8130

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26456
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式

% n/ G* q8 y2 V4 Y: N<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>1 R) u* e' K9 {5 a
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>5 }3 q( Z2 w' n/ |1 [
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>6 l) s* _* e3 ]  O. x% O7 w
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
0 [8 I5 Y2 }* ~; I% [但,女朋友的命令,我是不敢违抗的……<br>) U* l. A3 D2 e' E* h0 d4 C: Y
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>+ e! ]5 w: v  `% P
但是睡觉也不能缺!</p>( H& J' {* I0 b* t# O  w& Z- f1 q
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
, @! W/ o3 ]& A# U3 a) T% B<h1 id="python登场">Python登场</h1>
, p! W, f  U2 u& }8 J; D; w8 ?8 A<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
9 n8 B0 I1 x/ {3 {: W/ k$ O<h2 id="安装和导入">安装和导入</h2>* ^6 O+ B  Y. S! p
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
3 x& Z, k, e. R4 [( D6 {, r<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>+ N' g. O+ a7 C+ A# H) v; U
<pre><code class="language-p">pip install apscheduler( i: K3 f- a3 T: F
pip install pyautogui/ u7 M7 o8 j( E; o- }
</code></pre>/ S4 U% }$ y# `% R
<p>导入:</p>
  s% e; Y$ {- w! t7 N7 n  G<pre><code class="language-python">import pyautogui
  M1 F2 }/ u+ P$ n2 q' Q2 yfrom datetime import datetime
, g  m) n# }+ gfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器, Y  U3 @' D, u  G! |. G- V/ k
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
+ h( K% [; j& B+ |1 b3 v& Y4 G% x8 f# from apscheduler.schedulers.background import BackgroundScheduler
# X9 Y" j' T2 V</code></pre>
! O6 [- \. O+ L. Y<h1 id="pyautogui">pyautogui</h1>
5 e5 n+ P: x: ]" z( f<p>首先我们来实现自动发送消息</p>
! }* O% f9 ?" Z& D<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
6 {: I' o2 B/ {) f  u# c" Q<p>先来做一些基本设置:</p>
3 U( F- d: F; m' R<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快# U6 F1 r6 r4 v, [
</code></pre>
; F) b' Y- I: W2 x/ y/ O' r" f<p>然后我们登录微信,最小化。</p>; {1 O% P% X# O5 R# b* j1 k
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
" n# B$ |, j9 y. r<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
( C7 d* R8 Q2 S" W) Y7 ~7 ]4 wicon_position = pyautogui.position() # Point(x=148, y=879)4 R8 {1 h- _/ x1 u! E
</code></pre>. |4 i8 W( ^! s. |. T) f
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
. x+ v. @! d' t5 c. D( u<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
! i# j+ s, C8 x/ h/ ~. ?4 i, B1 a5 G7 B<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751): p) V- K* F. z
entry_position = pyautogui.position() # Point(x=174, y=751)
2 K: o7 o" A0 V' y</code></pre>
7 Z3 A( M  z+ w5 Z<p>接下来,控制程序依次点击这两个点:</p>$ t8 [+ i% G$ [: c8 i* D
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击- C* t! I$ V6 H; `* ]! P
# pyautogui.click(148, 879)/ U1 {6 i+ o7 M2 f& ?
pyautogui.click(entry_position)+ Q+ M! [/ R4 ~. m
# pyautogui.click(174, 751)  y/ }; T+ e; t/ c0 [; N7 d2 F, |
</code></pre>3 M" W( m1 d  n
<p>打开微信并锁定焦点后,我们开始输入文本。</p>% G" h. k& X4 `
<p>输入文本可以有两种方式:</p>" y3 I% K! ~7 H6 p2 F/ V: q1 ^
<ul>) d9 H8 {0 `! l( G$ X
<li>1 q( ~# L9 X+ d: h
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>' \' S5 Q- i/ ?5 c% M* n! Y% S
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>! }; A- k6 `. G; s  _) x
</li>7 g7 z$ m! ]% Z
<li>7 ?3 ]3 ?5 Z. c0 P5 _  L0 R$ B
<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
! {; ]+ P; B) @9 f<p>传入字符串,但不能同时打印字母和特殊按键。</p># h1 B5 j9 C  K3 L" o9 @
</li>
9 D$ s, V8 E/ n0 ~7 T) y</ul>1 j1 R& V8 M$ T3 n$ T6 h& |& |% s
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
7 K4 T+ }3 n) F9 I: @7 @( S<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间  q7 \4 q- r2 c% U/ t  ^, ]
</code></pre>
3 `7 k: B: G. b! ^) \" h<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>/ y1 d  u% W- T4 T1 r7 ]: F
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
/ b; c9 X! S; P% R/ [1 f' G+ Opyautogui.click(icon_position). \% \( ^0 G0 s
pyautogui.moveTo(entry_position, duration=2)
9 y1 w7 b2 ~/ i8 x) i; Y; w" M% ^pyautogui.click(entry_position)
7 f( C7 r. Y. ~! B) O" Vpyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选& h, r# s! k6 {/ I
</code></pre>8 p# b1 v. m* i. Q4 p' x! k( y+ f
<p>看看效果:<br>
, r& F/ W! S( P% |: T/ g<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
4 q6 x8 ]8 n8 P! J$ E; \+ N8 z当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p># V9 U8 W# r9 O
<pre><code class="language-python">import pyperclip6 {4 ?- F$ v) G6 J
% p9 j( R! `& K$ L
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制3 w1 X. m  a7 \/ V# F
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴4 E2 G8 Z, @( \; j0 E# P! t
pyautogui.press('enter') # 按下按键; z- E0 Q  V8 [
</code></pre>
& U0 f% _$ u5 c  u<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>1 W" w1 V2 W+ b5 |% k1 z& N
这样,我们便完成了自动发送微信消息的功能了。</p>
2 j: a! q0 Q+ d, S9 q5 R9 S6 {6 K<h1 id="apscheduler">apscheduler</h1>7 z) u; C$ h) b- o/ d& N
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
% T) k" f# h* }$ W  R6 `<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器6 Z6 l, i9 F2 Q8 k4 ^$ n
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务; Y% I& A* p4 e' g: c9 q0 ^
scheduler.start()% R, P( [6 t" C" c% c
</code></pre>
" f/ u( j6 H# u/ m) V<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>: @# r3 f3 ^/ @* l$ [0 n
<h1 id="完整代码">完整代码</h1>0 A9 ~- Y# p# Z% `; h! I
<pre><code class="language-python">import pyautogui
8 R7 d$ d3 o6 a) Uimport pyperclip/ n' q; E, M! P* |+ h2 g
from datetime import datetime
- Z9 I" ]- L7 X& ffrom apscheduler.schedulers.blocking import BlockingScheduler" q+ q) N1 \4 p8 {7 u; D
, \2 X4 ~. r* P7 m% f0 j7 r5 a7 S
def main():3 t2 x6 \( W3 o
        pyautogui.PAUSE = 0
( J8 X6 X8 o# R: y# l/ u) u
  w. H# R  n6 b: v/ d! i: {        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
; e1 \  h3 W% y" ~$ H! L+ ~  x  V        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
% A4 V( ^: l' Q7 ?- v
! R: |" i) i/ K8 U7 i9 `; n        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
- u6 l& @  u2 B+ e        pyautogui.click(icon_position)
0 N  j4 ]8 h' d# \1 x        pyautogui.moveTo(entry_position, duration=0.7): O! `* \. a* H/ n$ p" r" n
        pyautogui.click(entry_position)% [# I* ^+ M6 D3 d2 e
        pyperclip.copy('快去睡觉')' E6 z: ?0 n4 x/ G8 Z0 k
        pyautogui.hotkey('ctrl', 'v')9 t5 \" Z& I5 u8 {* K
        pyautogui.press('enter')& |: C% i$ G' n: Q( I4 ^3 S$ Z( Z
    pyperclip.copy('笨猪')* m$ C6 a' `% n* {
        pyautogui.hotkey('ctrl', 'v')
: C1 N% H2 T* H) ?& Z  W        pyautogui.press('enter')% \8 ?) n! n' q. s* N% A
    & E' u3 `+ @, O- O' x
scheduler = BlockingScheduler() # 实例化
! t! b  W9 S/ W. _9 }& J9 Xscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
/ u; |! d3 N2 e* Ascheduler.start()
) L2 ^1 H: e" O- x</code></pre>  w& {" z  f2 t( w  W- i
<p>完成啦!现在可以去睡觉了。</p>. y0 I) P( d; g
<h1 id="结果">结果</h1>
( t9 P, @% O, e7 e) i0 _5 N<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>$ Q& i; ]' U# `0 k- `
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
$ F* x5 n, q1 X, n% h7 k- r( e4 f3 ]<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>+ G, t5 e- Q: f- B) c0 K
<hr>
% J6 k0 w+ q! A! w8 C  Z+ y<h1 id="---the-end---">-- the End --</h1>
8 L* }0 k( A" S+ s& N, V<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>; f+ o% a0 U8 s* ?0 ^0 @( `! S
<p>打个小广告:作者CSDN博客主页:<br>
& G$ h% q, y* X- L7 T5 N* d<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>. ^+ D/ Q( [5 P/ F! ]: v# O$ |

/ Z8 d; ?; D4 q# U* J
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-12-8 07:45 , Processed in 0.066096 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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