飞雪团队

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

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

[复制链接]

7995

主题

8083

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26315
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
( c; ]1 O- m( S" s2 a# N
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>
6 t5 }" b. `9 g1 c3 b# L<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>' r4 [" P. `: I4 y4 z
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>0 g. a( I+ W4 Z* Z, u* Z
<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>! L: F9 ^, Z: u, H
但,女朋友的命令,我是不敢违抗的……<br>; n( n2 S3 E# D- a: C  A3 O3 M
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
/ ~: y7 H, a7 b9 _% T但是睡觉也不能缺!</p>
4 U& y5 k" ?/ U; d. m  M<p>这时候我们该怎么办呢?是时候让Python登场了!</p>
  u* d3 ]5 W2 }  ]5 J<h1 id="python登场">Python登场</h1>
) [8 ~9 A7 N4 `/ M- \<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>  `9 T% e$ ]: W6 E, S  |
<h2 id="安装和导入">安装和导入</h2>
* A5 @. U! t- k2 }% A<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
3 l' ~+ Q0 H$ r+ }* G<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
* {& w3 K  v0 p9 Y<pre><code class="language-p">pip install apscheduler: H! o& S+ V) B3 o+ Z0 Q$ g& V
pip install pyautogui
( x" {( V+ v8 A) R. P</code></pre>
6 d* M, w/ R- x: G1 T9 N<p>导入:</p>  Q" q& k' B+ H- Z8 A; o! D
<pre><code class="language-python">import pyautogui
" J9 S( d) D5 o1 |; \" ?from datetime import datetime
% N  ^/ h1 f6 H! H& l4 [  B9 Nfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
5 k0 v1 l  v, V, U  e3 X# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
, a$ l' U/ K% X# x( k# from apscheduler.schedulers.background import BackgroundScheduler
$ ^" q1 D# @& b( ]/ i# X</code></pre>
* p( Z( `) R" J& U" J<h1 id="pyautogui">pyautogui</h1>) ?1 y) x0 i0 @- z8 @% R: N+ I. H: d
<p>首先我们来实现自动发送消息</p>
5 {( P; O4 ~- s/ |% o# v' h: Y<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>) U7 W* p- r6 h, t, I: C
<p>先来做一些基本设置:</p>9 Z. G8 @2 a- }& Y: U
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
& @2 l/ @- Q" c$ }</code></pre>
6 I: p1 u" a/ V" c/ B2 r2 i<p>然后我们登录微信,最小化。</p>% a% J$ C  O6 g; D& p- G3 |& O$ B
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>/ t- B9 J/ Z+ N6 J, C. f& ?. K
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)4 ]4 P+ y& q, Z  e- J8 P" T& w
icon_position = pyautogui.position() # Point(x=148, y=879)
: E, K3 ^0 h+ p- g: K, g</code></pre>
4 q* e. t  q: B) f<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
' Q3 N% J8 B8 q& |9 L. e<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>
& S* t) X0 ^) `& f# x0 }# [<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
3 j. O& s% n  C/ x2 f, e6 Hentry_position = pyautogui.position() # Point(x=174, y=751)
  X5 U+ f3 S* S( h</code></pre>9 v( z) v; A5 k7 U
<p>接下来,控制程序依次点击这两个点:</p>
4 Y; P0 n5 w) K! x<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
$ V4 {/ J4 f; T: ]' e/ h+ w+ q# pyautogui.click(148, 879)$ j, @9 N3 o$ y5 t
pyautogui.click(entry_position)) N. n, H# t" v; \1 y6 N
# pyautogui.click(174, 751)
3 V8 O# [  F- O- c8 w# V& X</code></pre>0 \, ~: k9 J* ?2 x5 k0 Z( z
<p>打开微信并锁定焦点后,我们开始输入文本。</p>7 z. p3 Y' \( j! N3 E! M& j
<p>输入文本可以有两种方式:</p>! l* T, v( o: u
<ul>
/ ]! A/ q: l& d% R<li>  Z0 z2 ?6 h- r( R
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>& i1 I) _# e& z3 k/ ]1 U+ w
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>& J6 x- l) h2 j* n0 F: I) N/ E
</li>4 w. r$ I, \; O7 A2 n4 Z: M
<li>
% m. H# e' `5 C<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>
! Y" s+ V' f; s7 Z<p>传入字符串,但不能同时打印字母和特殊按键。</p>) M0 }, ^! S! L9 I4 ^& X+ o
</li>
& z% v( [9 a, J4 Q7 h, b</ul>/ H; @# ^' g; ?1 s0 Q& z; ^
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>: F  s+ ]4 g5 w  y- H
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间$ M# D, c  q  N3 Q
</code></pre>- @  `+ `/ ?! s0 R" K; ?2 P. u8 v
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>5 ]9 h, s  r6 |+ Z
<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选) g6 l7 J- p8 |6 u3 g4 v& v' A3 ]' ~
pyautogui.click(icon_position)
) W0 L0 ~- G) |1 m8 opyautogui.moveTo(entry_position, duration=2)
3 \. }( f7 a" s- s$ s# v# I  e2 g! Opyautogui.click(entry_position)
  ]+ }% i" Y0 z& e. U' I( X/ opyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
5 N. J# X! S( j0 l# _: G# r</code></pre>
* g7 H' b9 X1 N3 F* ~" ~/ j: t<p>看看效果:<br>
9 Y7 `  ^9 I" f7 A) p& x) z<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
% v) V9 Y# c3 ?. y; z. @当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
$ I2 Y! Q7 t. B2 c; @% W% Y<pre><code class="language-python">import pyperclip
8 }4 S2 X( ]# [% b  `0 G
# B4 J: O* j( r/ f& L: i7 c) Qpyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
& s9 Y7 b" Q+ P3 Npyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
0 s0 m5 |& e8 t  ~3 jpyautogui.press('enter') # 按下按键- c& I1 _4 P, R+ ^: Q
</code></pre>2 O5 t' s9 n) I* S
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>6 L' [4 h8 `$ {7 C
这样,我们便完成了自动发送微信消息的功能了。</p>4 k9 |& B7 R& }$ N
<h1 id="apscheduler">apscheduler</h1>
$ b  C- L- i: R7 a<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
( r" X4 W& [8 @8 |& p( z8 D<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
" A7 U) o3 s; L6 o  ]scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
9 T$ Z% u" b2 h( Gscheduler.start()% K( W/ `& @. B! @  V
</code></pre>9 C2 r# S8 V  B  |
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>  {1 m3 c  b& K% h* D4 u
<h1 id="完整代码">完整代码</h1>8 m2 F& j. z0 y6 B! s: C
<pre><code class="language-python">import pyautogui. n7 H- s% k0 p  V: J7 E
import pyperclip
# S% k& C2 `5 v& T0 N) Y% E* O' nfrom datetime import datetime  W" v2 [6 G  g. t+ ?% k
from apscheduler.schedulers.blocking import BlockingScheduler+ j1 L+ U8 ?' v0 n  b8 c

; j. d: B4 b$ o* }" |0 ~def main():( S, a8 h; B, q! T1 j5 l& r4 S
        pyautogui.PAUSE = 0/ m6 X1 m) l: [" s0 I3 N
  n4 s2 {6 J9 M
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
7 I3 X- @: x3 l$ z        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置$ Y) H! h. x- [% k- R: o

# A7 Y# \! ^+ q        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
& N) l1 p# B4 q  n! c+ p        pyautogui.click(icon_position)- ?  b. B: T: X# f- t
        pyautogui.moveTo(entry_position, duration=0.7)
7 F7 G8 B' C- [' u6 J+ e+ i        pyautogui.click(entry_position)
0 j1 Y! q; W/ Z: y( N        pyperclip.copy('快去睡觉')2 |3 _% ~/ a0 _# G: b7 b
        pyautogui.hotkey('ctrl', 'v')
8 [+ q$ m+ ]. F$ T6 M  d        pyautogui.press('enter')
% k! B! H" ~( r/ o7 s9 i    pyperclip.copy('笨猪')+ M% B8 S  }& w2 S# ~2 \1 b9 h
        pyautogui.hotkey('ctrl', 'v'), Z6 i4 t- r  C6 d5 F0 W
        pyautogui.press('enter')
6 U# U4 `0 \: I8 y: C, M/ @    / t6 l8 M  X+ S' W& l5 A; D9 |+ s
scheduler = BlockingScheduler() # 实例化. {' Q& J& A6 a( q$ Y. i7 j2 c8 l
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
5 E! `# |' l/ ~$ c0 Wscheduler.start()/ ~# Z$ b- X# p% J9 I( S% d
</code></pre>+ T, {' g5 I. B# G! i
<p>完成啦!现在可以去睡觉了。</p>; B6 |" x! L* t$ x+ w4 _7 K
<h1 id="结果">结果</h1>6 F/ f% K+ F) {# R
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>3 R3 L3 Z$ W: W& y& L
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
& q& ?. B, n$ c. x<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>: l& t$ f5 v% o  e( v
<hr>; B( Q' S2 i+ {/ u' \: @, c5 t# i! A
<h1 id="---the-end---">-- the End --</h1>- F& O8 l7 o" d  b3 e
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
0 R1 n+ Z; F# P# r; b$ y: \<p>打个小广告:作者CSDN博客主页:<br>% i0 j6 z) k' B7 ~: A
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
; s$ s3 z/ W! Q4 k9 \! v- M$ @% L5 D& ^' f2 v" r; ^+ D
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2025-11-30 21:15 , Processed in 0.067096 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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