飞雪团队

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

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

[复制链接]

8057

主题

8145

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26501
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
4 C3 C: T3 A. N# e  y0 H
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>
# i6 a* d; A* }6 z& J" z$ R8 _% w$ [5 l<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>  r& i& E' m% `6 X" y
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>" R# K4 k( U! F* o) }
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
/ @3 l, c: j, n% t5 A2 c但,女朋友的命令,我是不敢违抗的……<br>
& \% ?" j; [8 S" m! i. c<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>! G( m8 f( @# w' ^5 A
但是睡觉也不能缺!</p>
6 f1 m" C, H. ?5 L" q) v) ~- U<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
  k8 F$ a1 r3 G5 B! y- J. O. A<h1 id="python登场">Python登场</h1>
9 W+ L2 r6 [) b<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>" l# u* F* T7 G  b  Z" H
<h2 id="安装和导入">安装和导入</h2>5 _6 |0 W( b* p% y5 _
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
+ v6 ]9 }2 M8 C<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
! `3 J  `/ {6 P1 j0 ^<pre><code class="language-p">pip install apscheduler/ P  Q7 n" X: w; A, S" ^
pip install pyautogui3 A: N# q" I. k1 W
</code></pre>9 b. o- Y. }- E2 c! ^4 `
<p>导入:</p>5 ?$ B6 n: E6 k" }5 x0 S, B
<pre><code class="language-python">import pyautogui, N7 V6 R/ ~3 n% B) L
from datetime import datetime
3 `8 d) U$ R& a: D/ `! p8 |! P' Pfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器2 J7 j1 q  n6 W9 ]/ b) `  F
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
* T/ k! j9 p' `: L# from apscheduler.schedulers.background import BackgroundScheduler% g3 e4 O$ E8 K9 i3 f  O5 n
</code></pre>
! ^7 x1 K, {: J<h1 id="pyautogui">pyautogui</h1>, W; n2 x, H9 \) ~
<p>首先我们来实现自动发送消息</p>4 W+ i$ {2 B) |0 d4 ]  N5 k+ j
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
0 T1 k5 h% g7 `8 e<p>先来做一些基本设置:</p>
1 k% Z3 _: c% x, w& ?: X<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
5 C, ^1 C5 S1 Q, i7 S</code></pre>  E5 N! }$ n6 T
<p>然后我们登录微信,最小化。</p>  [" r, B9 J- x' {$ \3 F( f
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
! A' H1 h: Q, {1 |" @# v/ v<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)# x# Q3 _/ y: {7 Q8 M. `/ r2 G
icon_position = pyautogui.position() # Point(x=148, y=879)
8 u; _3 G- \/ D- t</code></pre>
' C) a# V7 E  J5 _3 |1 F' h6 x<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>4 L2 J8 m! k, O
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
" |+ r2 Z, x% Q$ _3 L+ P+ @$ N<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)+ k) h% c/ X+ X3 \! Q
entry_position = pyautogui.position() # Point(x=174, y=751)0 O6 @+ K/ `8 l6 m1 d- b1 j
</code></pre># |( L% y' B" t& b
<p>接下来,控制程序依次点击这两个点:</p>
0 I( o1 ?1 p/ ?( P8 u- J<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
. X+ |/ I1 G4 f6 r5 U4 e# pyautogui.click(148, 879)
* n; c; R( r2 h2 @& Apyautogui.click(entry_position)
' d; E* J# ~' z# ^% C- z, S6 B4 P# pyautogui.click(174, 751)
) q) e2 b' F! m5 q0 ?' U</code></pre>. {+ ]/ b: h7 {. I; ~- W
<p>打开微信并锁定焦点后,我们开始输入文本。</p>
% }% M: }* c* {3 Y7 x* Y8 c3 O<p>输入文本可以有两种方式:</p>
# @3 w3 i' A0 g  @<ul>
' P7 e4 q' \3 ~; L, ~; `6 R<li>
, W, Q& C4 O: I<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
0 g% E( p( ~# O$ ]  `6 w- ?: ~<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
$ ~5 m; Y( K7 c# t</li>
8 N" `3 S4 Y( ~& a7 c, b0 }' z4 ]# v3 Y<li>
) p& L5 J/ d# N( v. L<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>9 A3 s- `0 f: v5 W# ]- |& o
<p>传入字符串,但不能同时打印字母和特殊按键。</p>% Q( v! n7 ?; J" `8 d  T, A
</li># N/ O% X$ i& {* d
</ul>2 Z5 u  n- Q) }3 r7 v
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
2 ~9 m! ~& U0 g7 e9 Z9 _, ]0 C<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
* ]/ V3 `$ H( @- Z0 E</code></pre>
5 E* @' R: `& A: c0 `3 R<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
' \  ]; D" M) ^& P% I, F<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
' D( H, I# p1 M* ^pyautogui.click(icon_position)
' G" |- d5 }8 a, i3 f/ L( L' }pyautogui.moveTo(entry_position, duration=2)
9 p8 m- ~- s" G0 d( Q. Q3 g0 vpyautogui.click(entry_position)
3 {* r% z) Q# K* c' s# m7 ]8 o8 Kpyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
- J; f% x/ ?& E</code></pre>
: D! d& d( R" ^* v( E% g0 L/ }' c<p>看看效果:<br>
' H' U0 v- U1 E/ c& \$ c<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
) q& [; [8 H9 I  `) ?! ?7 v. M当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
. b9 O# a. s$ [  n) q<pre><code class="language-python">import pyperclip/ {- ^. p: `$ n% q+ c8 x% E2 w

7 I7 E) G9 p4 z' U2 E. o2 m, qpyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制0 W6 k. u7 s" u6 w7 u6 q% ~
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
  A: M* I0 Z5 W* {' _7 x/ \pyautogui.press('enter') # 按下按键, [! C0 M9 ^6 E" g$ v' u; d/ n
</code></pre>0 `# |. e& L; E4 N: G
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
/ y3 n2 H- H* ^* ]这样,我们便完成了自动发送微信消息的功能了。</p>6 ^+ a5 J& [4 Q& y
<h1 id="apscheduler">apscheduler</h1>9 l. m2 K. ~4 O
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
2 Z& I: l1 D: E. B<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
/ `0 E9 O  F* M: hscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务( r! d' ~5 t) u+ `' F& ~" d
scheduler.start()
5 U% L3 D3 ?- \" Q</code></pre>: y: N5 j6 ~. _) _
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>8 P& ]% E+ Z) E% ?" r! |
<h1 id="完整代码">完整代码</h1>
" L+ ^4 x; L- d1 Q4 z: s& R# M<pre><code class="language-python">import pyautogui
! Q% L) @6 u- q- _, C/ Nimport pyperclip
; E9 H5 N6 M" l2 t( G8 kfrom datetime import datetime$ Y' r8 m; M, s+ p* ?0 R, u
from apscheduler.schedulers.blocking import BlockingScheduler
$ E! {3 J7 x. F
" Z$ g. j" L9 b$ f$ T+ C5 vdef main():9 N, Q, S( v# c5 ^. {
        pyautogui.PAUSE = 0
$ w' \8 d4 f; U- f* z
4 u- x% Y+ Z5 j" G! p% c        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置, a- `) w  \& k( @3 ~
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
2 O3 `- T* [& I
9 k% \, ]- b% ?+ _, g# h( n$ ]        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
: \6 P) L+ k# x5 d! P+ y# ?        pyautogui.click(icon_position)7 T( R5 }/ I2 p* g0 [+ i$ S
        pyautogui.moveTo(entry_position, duration=0.7), G- T1 b8 [7 ]- ~7 K( `5 o5 B
        pyautogui.click(entry_position)8 F3 p' D. N# y  S; `- `2 K
        pyperclip.copy('快去睡觉')
( G0 q' y: z6 V" _+ e2 _        pyautogui.hotkey('ctrl', 'v')
5 I# B, |5 Y* [! }        pyautogui.press('enter')2 j+ J. t) g1 F7 ^, a
    pyperclip.copy('笨猪')
& N6 ~7 `7 u* w0 M# ~; l+ m        pyautogui.hotkey('ctrl', 'v')
' y5 A9 P* j6 m) W4 d3 b        pyautogui.press('enter')+ ^3 z1 f  h# U  r7 o* \9 A' y; n
    / m; @$ S3 l" b5 g4 o7 X" V" [
scheduler = BlockingScheduler() # 实例化& D0 _1 B+ w3 c
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
7 H7 r; z  W+ f4 P$ F' kscheduler.start()2 F! y8 H5 B" q8 S
</code></pre>
- P/ j& Q( b  w/ A- M2 U% S5 i/ f5 ?<p>完成啦!现在可以去睡觉了。</p>
  \8 @/ q/ R4 [. r( J" f4 H<h1 id="结果">结果</h1>4 R) a- w' n2 ^
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>3 H# e: E1 Y9 A' C% J2 K5 W" @8 J
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
( v4 }  b  ?" t+ U<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>* J0 p0 I8 D% j/ x: |7 |- P( s
<hr>! `1 E' E8 _& c$ o0 E2 r( p- g- l, n
<h1 id="---the-end---">-- the End --</h1>
$ d' s0 C/ q0 f' r! q. a<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
/ i6 W& Z2 v4 p  k* E) \4 a) o6 }3 h<p>打个小广告:作者CSDN博客主页:<br>- Z) }+ R* X  r4 Q9 Q
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
- ?, g/ U5 Y# V  u! t
9 N- p+ @- s0 S
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-12-13 10:47 , Processed in 0.064374 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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