飞雪团队

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

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

[复制链接]

7896

主题

7984

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

; L; k2 n: b' _6 n+ B<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>: {( w$ \# v9 q7 k
<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>, b' o( w7 n- [' K0 E
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
! j* w: D# [# _<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
- M- Y9 V. Q1 U- p4 m4 K1 O但,女朋友的命令,我是不敢违抗的……<br>
% X1 ^5 w6 O+ z) ]: f5 R* ]' ?, S<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
" u2 P* W+ s. ?但是睡觉也不能缺!</p>6 b% ]9 H& `1 J* d4 ^5 ]5 m$ o
<p>这时候我们该怎么办呢?是时候让Python登场了!</p>" S6 m. z4 k5 m; [0 l
<h1 id="python登场">Python登场</h1>, C( \( {! N& {3 K+ Z# j$ Z
<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
, P- _$ I# V( d* o0 I; q+ ?& l$ j<h2 id="安装和导入">安装和导入</h2>
1 ^' S% \, }( }2 h7 g! t/ R) R<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>% u. |5 K6 F3 J. j, |- R6 M. i) ~
<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>
# p5 I$ }7 U! L7 y0 M<pre><code class="language-p">pip install apscheduler. E. t2 Q3 }7 H* E6 Q8 {9 `
pip install pyautogui9 N9 m( F$ _: j; Y! Y
</code></pre>0 h& M7 s4 w( r3 J* G
<p>导入:</p>
5 ?' c: D' E$ D0 `& M; N9 }) I/ x<pre><code class="language-python">import pyautogui
- x2 U* d: r" [2 }  K- Hfrom datetime import datetime4 Q5 b( ~$ J+ v  d" f% z6 H( e+ O
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器/ a3 C: A: P2 \, e" |" \
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
+ l3 D" I1 h5 w! [, D# from apscheduler.schedulers.background import BackgroundScheduler
  `+ O( \0 \( c& P</code></pre>) ^7 k# ]# M; N! p
<h1 id="pyautogui">pyautogui</h1>6 j4 E7 Y- T/ F. Q7 B
<p>首先我们来实现自动发送消息</p>8 ?& c) b* U8 W# V$ ^; @
<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
% f4 F) z, Q3 c<p>先来做一些基本设置:</p>7 a' ]( Q* E' _4 ^) _! I- A6 t+ ^
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快* g2 ~1 ]& a. O4 a* ], Y& y
</code></pre>
+ R: G7 C! K1 H) f" H<p>然后我们登录微信,最小化。</p>$ Z7 ~( c5 J8 D# a& C+ f+ v
<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>
$ q+ V3 n0 C! D* o0 Y; x<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)/ {# \* u! \! J7 O! k5 M7 s& y, Y" I
icon_position = pyautogui.position() # Point(x=148, y=879)
( v- ^: `/ X7 h5 F" [8 e</code></pre>1 z- I( v; Y: e
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>7 o* [- `6 W- x
<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>. s2 Y4 G# a: Y- I3 n8 S
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
2 |! ]/ G; w( wentry_position = pyautogui.position() # Point(x=174, y=751)  V- Z; O+ q; p1 g  k3 n2 j
</code></pre>
2 K2 _% O  c  o* H) r& T2 X<p>接下来,控制程序依次点击这两个点:</p>
7 F  o& C% X2 P4 G  n<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
3 k: g  q. Q* ^4 F) {, O' c. [# pyautogui.click(148, 879)
+ K7 ~. [4 T3 Q* u5 ^pyautogui.click(entry_position)
. s- ~  U% E( m+ t2 u; v  x# pyautogui.click(174, 751)
1 K3 j: }- @7 s2 {/ m9 ]. \& u9 m</code></pre>! n/ o0 d/ Q! y6 g
<p>打开微信并锁定焦点后,我们开始输入文本。</p>1 Q2 Z# v. K% R+ [1 T" K0 L% T9 }
<p>输入文本可以有两种方式:</p>
5 I, a3 {9 v. N9 `8 h% s& x<ul>! {4 G0 E/ `# S# x/ e0 U
<li>: m9 ^& A2 g, b6 e
<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>
) d, T- Z! A4 t( R) U* W/ O<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>' e8 g" w  Q, e; @4 W1 S
</li>7 |! a  C) H* O0 y7 Y# }. Y! K
<li>
2 }" y* ^, q6 C  S' }8 f  L* F4 v<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>5 d3 L  a, ?+ Y7 k
<p>传入字符串,但不能同时打印字母和特殊按键。</p>7 ^: K4 ?# F: t# J. D* B8 l# r
</li>4 g0 h9 p6 {5 G
</ul>
! _5 A+ O3 _6 t5 k( g' d9 K9 h<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>
6 U/ n" y+ W' z6 J<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
# \" a: a+ @$ s4 o2 I6 i</code></pre>
5 ~. K- w, ]! k5 f3 y<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
8 y4 d" |* {  s$ p<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选9 K4 J# o3 C# ?, v5 P
pyautogui.click(icon_position)
' r3 P: N8 `/ Z# wpyautogui.moveTo(entry_position, duration=2)
' n% n+ l( ^& V; f: {8 g/ E3 cpyautogui.click(entry_position)
. V6 u9 O  v$ ]0 X  s& Opyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
2 q: b/ N4 S- ?2 I! ^</code></pre>
- D% A7 I. d. X<p>看看效果:<br>
' M! G' u0 H+ ]7 S<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>" q" I- b% O; _5 c$ w: c
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>/ r! Q. }; g' y  S& a0 d+ j
<pre><code class="language-python">import pyperclip: R5 N9 w* m- D% V* }

6 m9 i$ c+ N  Y- Cpyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制$ }7 Y, t1 V% D
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴1 A' i1 q! ^9 y. R
pyautogui.press('enter') # 按下按键5 w5 Z" }/ P% m. w  j
</code></pre>1 I% B& P) \3 ]4 O5 k& }+ }" C
<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>8 k. k4 v1 d  A1 Q& G2 u5 r8 L
这样,我们便完成了自动发送微信消息的功能了。</p>
5 H! Q( l8 H: J& P4 l7 Y& l<h1 id="apscheduler">apscheduler</h1>' {$ c1 U0 o! i# n. A/ u+ I
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>
' s6 S+ q$ ]% S# w+ ?: E6 }; _- Z<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器
/ f5 M3 z4 q2 E, Wscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
8 v6 X5 c9 b& x) w/ C6 }3 {scheduler.start()9 h& T' C( U6 W6 a9 |+ X
</code></pre>. ~/ C: V: ]) N, h
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>* y* V* j  W  O' E+ A# z
<h1 id="完整代码">完整代码</h1>
  k/ |& J% [5 o- X7 I5 F! b- \<pre><code class="language-python">import pyautogui# K8 s2 R+ ?% J
import pyperclip
: `0 h  R2 F& gfrom datetime import datetime
2 k! E. F8 S2 d* M3 J' Q: [' bfrom apscheduler.schedulers.blocking import BlockingScheduler0 }4 M0 O* Q! j; p7 i0 r
: R# L; |# c. ~2 a% _
def main():
. r8 q$ _. \3 C8 s        pyautogui.PAUSE = 0+ ]8 X) p5 P( m: v0 b
% p5 {: X3 {- F8 B- x- p
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
: T( l& A: ^+ I+ i( O        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置0 k) n" g" ~4 L' L  ~8 m9 v
& P6 E& e; u# c; Q$ v
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
  R5 N/ }6 k) g$ z% J. z8 Q9 h        pyautogui.click(icon_position)2 H  m9 S3 z  s& A7 k+ e) w
        pyautogui.moveTo(entry_position, duration=0.7)
2 B+ A' N/ S3 c. R& M        pyautogui.click(entry_position)' g. W1 J( q" N. w. Z( i) m
        pyperclip.copy('快去睡觉')% D& U* `8 N7 R
        pyautogui.hotkey('ctrl', 'v')/ ]; o4 P; j, T$ |
        pyautogui.press('enter')( L* N! f; s' e/ s7 B$ V
    pyperclip.copy('笨猪')
, H2 m/ t; T& V' l- O( X% A        pyautogui.hotkey('ctrl', 'v')
: r2 o' g. j& ?; H! i        pyautogui.press('enter')
: Y- a" Q4 j. Y' M! t( r4 h    , y) s3 T  e% D5 i- V4 n! {
scheduler = BlockingScheduler() # 实例化
0 Z/ \: ~# T2 escheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
6 z* ]' N0 e1 t1 b/ a9 U0 ^scheduler.start()/ F( m3 b! V4 c/ e
</code></pre>  N3 q' Z* V! M  s7 @$ I- Z
<p>完成啦!现在可以去睡觉了。</p>
# \4 M3 B) b- h2 {* u2 R<h1 id="结果">结果</h1>& h  n2 x) a) |, ?' k2 C8 l
<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>) P) f9 `5 n, _$ Q+ }$ G& b1 _" M5 F& a
<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
  r) D: V+ x" g0 }/ s. B<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>, Z6 b7 c6 s) D
<hr>
# h; ^- p) l& B<h1 id="---the-end---">-- the End --</h1>9 X# M! H7 }1 I7 r/ g! v
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
; Z( a' G7 l4 T) [( A* ?3 ~<p>打个小广告:作者CSDN博客主页:<br>
9 e- T3 M, q' z<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>$ o4 x% Y8 Z# p8 F2 D
( S( G1 `  g: c- {
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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