飞雪团队

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

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

[复制链接]

8019

主题

8107

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
26387
发表于 2022-2-12 14:35:43 | 显示全部楼层 |阅读模式
, L- o$ @4 m% |3 Z
<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>
* e+ {8 Y3 c. Q<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>/ ]& `% ^# _" P4 Z2 I( M
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
; N( L8 g- ]" w$ A+ M& C0 t  W<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br># h5 T. M5 X+ D0 E" }! ?
但,女朋友的命令,我是不敢违抗的……<br>* w3 p% J+ C: Q- w- \! g4 \/ `" [
<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>8 f  x, ^6 R4 |
但是睡觉也不能缺!</p>9 {& s# m3 w8 e6 S  j4 R; B
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>0 ~( D5 @8 i+ \8 q/ D
<h1 id="python登场">Python登场</h1>" w9 c, p; ~9 g: h) N0 c" ?
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
2 t- j7 {. }- U8 m<h2 id="安装和导入">安装和导入</h2>2 r( N, b/ K  l$ C
<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>6 N* N  \) t! H! s5 L3 K( b  h
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
4 b! `( R3 F6 f" @0 T<pre><code class="language-p">pip install apscheduler/ E! }8 ~4 B5 @. o, Q
pip install pyautogui$ T$ E5 C, e4 Z# B8 H- N8 v
</code></pre>
5 N3 _' W: f; |, q" m<p>导入:</p>) z8 ^# ^& N2 x& }" M
<pre><code class="language-python">import pyautogui) M" U; V2 b/ X$ W
from datetime import datetime
2 `9 D3 s% D: u" _5 }8 f/ o$ Sfrom apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
% R0 P. s. D5 p  ~5 O& K" u# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:" j  Z, }2 Z' u- g
# from apscheduler.schedulers.background import BackgroundScheduler( I6 A3 g3 k- [' r# _7 b' M) k
</code></pre>2 V- Z1 r: d. P
<h1 id="pyautogui">pyautogui</h1>: i2 B/ W, ^* Q) j+ b
<p>首先我们来实现自动发送消息</p>9 b6 Q: [; |/ t- \7 K9 ~, a
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
% |% t. U4 }% n5 k# F- N" g<p>先来做一些基本设置:</p>: @1 W9 i! p# b2 k
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快) d9 f, s+ g4 _1 _  O& h+ `
</code></pre>% z3 x5 w9 |- W0 |
<p>然后我们登录微信,最小化。</p>7 {" A* ?" \' k2 x
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
0 R/ F, `+ I% J2 D. O<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)+ u# L% L0 [/ S' R7 s
icon_position = pyautogui.position() # Point(x=148, y=879)  ?, h  @; a- k4 k2 a) J9 O/ I
</code></pre>
8 y7 `5 W" D- l+ w5 S<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
: V$ S& l) w* l( Z( W<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>) ]0 ]2 \0 b7 X
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
& s) v) `% c+ d( h1 w6 t3 w" b( t4 N% tentry_position = pyautogui.position() # Point(x=174, y=751)
/ n* Z* f# M+ P& d2 M) `% s</code></pre>" Y7 _0 [6 N: g8 L6 X# U8 \. f
<p>接下来,控制程序依次点击这两个点:</p>6 b2 F6 g2 s4 J; m! |8 c! \, j
<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击/ V) S' |% L7 f2 j2 M" \( G
# pyautogui.click(148, 879)
' ?) B9 G' r6 v4 H1 dpyautogui.click(entry_position)
4 n# `& `1 `, I# pyautogui.click(174, 751)* F$ r" n: `/ D1 [; i& q4 P
</code></pre>
, h/ i5 R, J7 f+ K9 W, |2 u<p>打开微信并锁定焦点后,我们开始输入文本。</p>, ?1 _6 U0 i! K! l
<p>输入文本可以有两种方式:</p>1 V* E8 s8 I* f' X8 b) e# q; ^( w
<ul>
5 S5 \4 S# Q2 B; V+ \<li>
- b9 w/ c/ D5 }, F% r<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
+ v/ x; o8 @1 H& ^* S# y<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>
0 F/ q/ H+ l% N</li>* c* P2 B! I0 z% P/ W6 X4 c
<li>
' o+ e0 A; b) o( @: S! R<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>% v/ G5 q! @* T$ t' v
<p>传入字符串,但不能同时打印字母和特殊按键。</p>
$ P+ |; |4 B# G8 |</li>
6 h' R6 d8 {4 i2 L</ul>0 ]" c: q. b. v& v( `7 [/ A
<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>+ l! v# A& [' b* L/ Q
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
, ~4 u8 v( r. j* Q% C</code></pre>& N& S+ q$ F+ Z4 V) \6 [" \  Z1 P1 G
<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
& A! y8 \* p) @<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
2 Y9 U5 @8 ^2 T- }- A2 opyautogui.click(icon_position)
% u+ R8 S1 b5 }pyautogui.moveTo(entry_position, duration=2)
) k$ A5 r( L- r2 T9 U  X% I/ lpyautogui.click(entry_position)- ~6 F- `5 ^, x' c- v
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选1 P$ h$ a' S2 K( z- b, {  O
</code></pre>9 H" }+ Q& z9 o3 j
<p>看看效果:<br>0 H! y; N$ g; Q. l0 {' |4 z
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>$ a: M# `; I( ~& _6 W4 H
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
! G; e! H! D( G, b5 v9 D5 @; Q8 Q/ x- l4 l<pre><code class="language-python">import pyperclip
8 p" o# u5 o0 q$ x* L+ B; I1 C8 E& s0 c- Y( ^: c
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制( w3 ~! r4 @# h
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴6 V2 W4 q$ o2 C+ K2 a# W% [0 f$ @5 q
pyautogui.press('enter') # 按下按键2 S( n; z( R! v9 v! h. r
</code></pre>
$ ]7 T/ p5 L4 p/ Y) L<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>9 ^0 R* {- q4 O/ O9 P) {0 p
这样,我们便完成了自动发送微信消息的功能了。</p>
% c" r( |& A2 k<h1 id="apscheduler">apscheduler</h1>3 f* g  Y1 y+ Y1 E3 t% b
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>% ~  V4 G3 W* p- j
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
0 W4 z6 Q4 {# u" ]. wscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务- Q: J: Y! `8 D6 Q  a
scheduler.start(). \5 j+ ^1 Q# T9 Z; s* y: z- s6 u
</code></pre>
! t4 i- V0 Y" s- Z# T0 Q<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>
' n8 R4 k7 S( D2 U" ~1 q" U4 n3 H% F<h1 id="完整代码">完整代码</h1>+ x- q4 P) V! ]: b
<pre><code class="language-python">import pyautogui3 ~7 ?+ }% W' g) z9 A- r
import pyperclip
0 O- k+ w  `  r; o9 e' N5 @+ Mfrom datetime import datetime' @$ m8 N( A/ y/ k
from apscheduler.schedulers.blocking import BlockingScheduler. h; Y& ~- I: L: _+ b' n  O
! W# }9 [4 a0 e! s
def main():
+ L/ ~, ~0 }8 `2 x* c        pyautogui.PAUSE = 0, X: n6 i, S) V6 a; ^

; T; E; ^: y( ^6 h4 l        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置$ @, |& G' c- e; x# ^* G3 u
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
; _6 [# p' _( l' ~5 Z0 Z0 R5 Q
8 J1 H& j5 p9 L# _' [! P5 q) @, ^        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选/ d7 [( D+ x% ~9 M6 G, z/ R/ x& R
        pyautogui.click(icon_position)7 U$ U7 d( I6 j1 F; B; |
        pyautogui.moveTo(entry_position, duration=0.7)
6 U* t  J) n" C        pyautogui.click(entry_position)
  ?' c) {2 V' `8 r        pyperclip.copy('快去睡觉')- Q# H5 _, y4 r. a* y. }
        pyautogui.hotkey('ctrl', 'v')4 T, V; a2 l! R# f3 ]0 G8 o
        pyautogui.press('enter')
% o. H! f1 C* Y    pyperclip.copy('笨猪')2 B" w% G- p7 `( Z- L& L
        pyautogui.hotkey('ctrl', 'v')
. v, t. V* u6 K+ F, q1 v        pyautogui.press('enter')7 T9 I1 T9 q2 O0 T6 Y% J6 {) A+ c
   
/ [, k; ]9 J( G+ l' Q, ]9 m/ u# y" Vscheduler = BlockingScheduler() # 实例化
3 o# o- v% m% o% Q. o3 M8 Fscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
' u- W: k3 R) n$ ~/ \scheduler.start()
( V# {; Y1 y) O/ l# i</code></pre>
/ v& Q, V- T$ `! i<p>完成啦!现在可以去睡觉了。</p>4 O* B- [# U$ Y9 [7 V8 z
<h1 id="结果">结果</h1>. m) y  ]! Q8 |, a( p( `% y* c' n
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>8 v6 U% {- d* b/ m
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
% ?4 ~5 g3 e4 e+ t# G: J<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
- f8 K; O3 x4 ?& n( a6 F0 e+ M, l<hr>
  B3 J5 p3 W! m+ A. M; e<h1 id="---the-end---">-- the End --</h1>; U/ }- t$ T1 M! j* r  [
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
% }5 A. I% _8 y# H. @<p>打个小广告:作者CSDN博客主页:<br>5 g8 u8 f0 }! b$ n' u
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
& H) o$ X1 E0 P7 {6 @4 o) v3 T8 g& n7 r+ ?! t9 @$ @
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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