飞雪团队

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

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

[复制链接]

9321

主题

9409

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

! Q1 t2 b: n/ ~7 }  h<p>事情是这样的:今天晚上,女朋友让我十二点催她睡觉。<br>
  ], g, C8 W2 s) g3 f9 b<img src="https://img-blog.csdnimg.cn/28feb6811cc142f5b0e38e81e73d5043.png" ><br>. o1 k+ O1 A; K5 _8 u
不过,可是我实在太困了,熬不下去…… 是吧?女朋友哪有睡觉重要?<br>
( h/ V  `$ J* q5 o, X<img src="https://img-blog.csdnimg.cn/ddf8351a359e45218952d4d3962ff278.jpg" ><br>
8 I+ Z: |. x1 R& j但,女朋友的命令,我是不敢违抗的……<br>
) e" ]' N4 M8 _  T, L' h7 u) T<img src="https://img-blog.csdnimg.cn/87fe69f100904f4782a720254ef49191.png" ><br>
" X# s% n# H0 ~但是睡觉也不能缺!</p>
1 k" t3 R& w2 |, P<p>这时候我们该怎么办呢?是时候让Python登场了!</p>9 N9 y( ~4 k5 n4 x$ J
<h1 id="python登场">Python登场</h1>
' r5 a6 X4 }8 Z% t: a; z/ a% P<p>这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。</p>
5 [. ]+ c, {' D% G9 p2 c& k$ `) }<h2 id="安装和导入">安装和导入</h2>
: N: `: i( f& S+ n<p>我们需要两个模块:<strong>apscheduler</strong>,<strong>pyautogui</strong></p>
/ X* K1 [& W; L5 }<p>快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:</p>7 ~. N1 s* I" ~+ H/ z& u9 W
<pre><code class="language-p">pip install apscheduler$ Y% M+ y/ X: @2 g/ {5 c: v9 t3 ]7 z
pip install pyautogui
( [- I: _1 {$ w' w! o4 l2 K5 w</code></pre>0 `* l0 s: \4 M1 t
<p>导入:</p>6 b5 r2 j# b" K0 J5 C
<pre><code class="language-python">import pyautogui
6 [/ i# s( Q. Z6 Tfrom datetime import datetime9 `9 J" l5 @6 U* }
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
# q, f2 x; ~8 t1 f& _& p: @# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:- r+ X7 `: O" O8 W" O5 o
# from apscheduler.schedulers.background import BackgroundScheduler
, U6 F3 s& Y. B# _</code></pre>4 d) d: d4 v9 s  q9 K
<h1 id="pyautogui">pyautogui</h1>
% z2 e/ o/ }3 h<p>首先我们来实现自动发送消息</p>
% v# L7 a" Z  V8 T<p>pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。</p>
; P, i$ F, T3 n% ]; [) @<p>先来做一些基本设置:</p>5 G- s) Y! H: h7 z, S/ V. e) r5 H
<pre><code class="language-python">pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
9 `2 y, L/ k* P/ \, Y7 g  q8 U</code></pre>8 z1 Q# |' E; D- i, O: S8 E* e* F
<p>然后我们登录微信,最小化。</p>
& B- V1 G! b  h5 z, \/ l9 P+ a<p>接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:</p>% U& ]! ^9 T9 ~3 O7 a4 p- Y) o7 g# w
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
% d8 e1 |+ p" I8 w4 L4 p  Ficon_position = pyautogui.position() # Point(x=148, y=879)
7 }9 z, a7 p% n( g, W! q1 U</code></pre>" E! ^# B! R& s/ k1 O! m8 G/ {  u
<p>打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。<br>
4 l! b; y7 m2 w8 g" `! ]! S<img src="https://img-blog.csdnimg.cn/4809ee2ce93b40a0828717f811b02599.png" ></p>6 z- q4 w/ F( F9 _8 C1 r8 U
<pre><code class="language-python">print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)' s6 ~+ I2 O- T6 _* g- i
entry_position = pyautogui.position() # Point(x=174, y=751)  e# z( T6 H( [! F+ i
</code></pre>
$ s0 Q9 ]* H0 Z' P8 s<p>接下来,控制程序依次点击这两个点:</p>
6 [! }' N  z* ^# z* {$ W<pre><code class="language-python">pyautogui.click(icon_position) # 默认左键单击
$ x* C! p6 x) D( S6 [& d% b. v# pyautogui.click(148, 879)) g' o; ^) B( J5 w
pyautogui.click(entry_position)7 E2 A  @/ p+ N( T5 y
# pyautogui.click(174, 751)
/ r# V# u0 t0 X* [5 W</code></pre>8 k# ]: Z: H) V3 r9 p) R! @  o3 a
<p>打开微信并锁定焦点后,我们开始输入文本。</p>
( S2 U% z2 c* s4 T7 S% W4 }<p>输入文本可以有两种方式:</p>1 `! y8 P) b+ n1 j" [2 ?" p
<ul>3 |% {- M" r2 g; I' {( y+ W) \: ?* v
<li>
7 J# j% u9 w- z; F& A<p><code>pyautogui.typewrite(['o', 'n', 'e', 'enter'])</code></p>/ D) q8 [- B: o! O* A  F
<p>在方法中传入一个列表,里面每一元素都是单个字母或特殊按键</p>" V) X2 J/ T6 `5 S  O
</li>& E; F3 ^* B3 w! S$ j
<li>
! b# M/ [6 F) f4 B5 p<p><code>pyautogui.typewrite('You can type multiple letters in this way')</code></p>+ ?4 u3 \. G' b3 X- p4 }) r
<p>传入字符串,但不能同时打印字母和特殊按键。</p>2 C7 N, z( s9 }/ A/ z
</li># `( @2 E2 ?! |! W3 {
</ul>
! m/ G& m, O  g/ K& m<p>这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。</p>- @8 d/ U+ q6 B. l" b/ P$ v
<pre><code class="language-python">pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
* p* C' y9 n( y" H</code></pre>
, V  n, k# k  c$ e2 P# ?<p>为了使我们的操作更加 <s>人模狗样</s> 像人的操作,我么来加上移动鼠标的代码:</p>
% T+ g5 ^. b2 ?<pre><code class="language-python">pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选$ W2 y& J2 Y0 }4 {9 {( K
pyautogui.click(icon_position)/ {+ w7 j# x7 _2 ?: r2 i- u
pyautogui.moveTo(entry_position, duration=2)4 Q7 D0 J1 m- Y5 Z3 l& k
pyautogui.click(entry_position)  M2 C% ?% e& j% y% n
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选" z6 C! g/ Z, S2 o# h
</code></pre>4 H# H3 c; Q0 W9 C/ X' S" J1 M% x0 R
<p>看看效果:<br>/ `- b( _- q3 E6 S
<img src="https://img-blog.csdnimg.cn/88126f4b522c4584a3de07c4c35a808d.gif" ><br>
1 z5 @3 {5 W8 _& L4 k5 y" R当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:</p>
2 U8 n3 H9 i- k5 u! s( d' j<pre><code class="language-python">import pyperclip
  h6 R. c' g8 S2 T1 V  o1 ^, Z+ A! J! z0 y
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
' O& c/ O9 x. kpyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴, B$ F5 V7 c8 ]+ _: K% g( M5 [
pyautogui.press('enter') # 按下按键+ f  a! e6 S6 w5 s% @, ]# x
</code></pre>
3 L( T  G! a2 @/ X<p><img src="https://img-blog.csdnimg.cn/d178d71e5d564893a1aee8672841c76a.gif" ><br>
' S9 O- A  t+ d' d8 ~' C这样,我们便完成了自动发送微信消息的功能了。</p>
, q5 U0 {/ z, G7 P5 [<h1 id="apscheduler">apscheduler</h1>% v  g8 r! h# a) l4 R
<p>APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。</p>) g3 F3 L# _# {- V( o2 e+ E
<pre><code class="language-python">scheduler = BlockingScheduler() # 实例化一个调度器- T. v& c, F, ]* f2 d; X- m
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
, t% y6 K  b! R" gscheduler.start()
# R2 e( ~( \1 }& G2 u</code></pre>0 I; E5 s2 Q: d
<p>add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。</p>7 _) n* B" k, `+ l: T$ Y8 {# _7 I
<h1 id="完整代码">完整代码</h1>
- V# z0 C) a/ m1 t* b<pre><code class="language-python">import pyautogui
- h2 J8 d- f0 g* A+ H0 Q% kimport pyperclip1 T9 z: Z& K) o9 R# V% m% P
from datetime import datetime4 G6 r% z  e3 S" c, A! X
from apscheduler.schedulers.blocking import BlockingScheduler
; S: |& I8 P  y$ z' S2 t8 @+ i
+ f1 u) b- F; a$ ^def main():
, x) a. ~; i$ R7 l( i        pyautogui.PAUSE = 0
& D: T9 j; C- l) ?+ E+ N& K2 p& p% C( {2 v7 d0 G
        icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置3 @# p% c3 Y8 m5 @
        entry_position = pyautogui.Point(x=174, y=751) # 输入框位置/ ^" E; }9 A2 _; B
9 H, d) }/ I- G3 s
        pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选# V. h' l! k4 d% J6 b8 ?) S
        pyautogui.click(icon_position)) L' h* e0 K1 \: I! ~
        pyautogui.moveTo(entry_position, duration=0.7)
% g5 S" {( y6 @        pyautogui.click(entry_position)
  A' c# E6 G: V( h/ B        pyperclip.copy('快去睡觉')
/ w4 e* w5 D2 l6 O- x9 j; g        pyautogui.hotkey('ctrl', 'v')
- }" G. U- ?+ Q: }4 V        pyautogui.press('enter')% v$ i$ G' J3 O' i1 g# {
    pyperclip.copy('笨猪')
2 r! {; K) e+ e6 W) f" v, `$ O9 I        pyautogui.hotkey('ctrl', 'v')
, n8 s9 I$ i4 J, Y8 C& ~        pyautogui.press('enter')5 e9 \% m* q3 V6 d" g
    5 ]$ r5 j4 W! C8 s# D  y$ `( H
scheduler = BlockingScheduler() # 实例化
) ~& P2 M- D/ d9 {; C" s. Hscheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务/ Q7 w8 h) L7 @  ?9 }6 c
scheduler.start()7 }0 B9 c( ^( S/ s% ?+ O. l
</code></pre>9 S1 u3 t) z' }. D9 s
<p>完成啦!现在可以去睡觉了。</p>" @# }4 R5 d' h. U& _& m' E
<h1 id="结果">结果</h1>
+ A2 P: U9 Z: ~<p>第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!</p>
) ^9 |! D) U& Y) f# C4 m<p>不过,好在女朋友没丢,我成功完成了女朋友的任务!<br>
- N  q8 N7 u3 t9 V! w<img src="https://img-blog.csdnimg.cn/111c7494bd6e4371bbd541529c48b776.gif" ></p>
. X5 R, m2 e5 Z% T* h<hr>2 v, f! y; K% {( A! Z( v
<h1 id="---the-end---">-- the End --</h1>3 f$ w7 Y. D* u$ |( O# O
<p>好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!</p>
  P2 \# E8 r$ O3 }' a7 I+ l9 P<p>打个小广告:作者CSDN博客主页:<br>, I4 s! R1 S* C. t5 @' @! ?
<a  href="https://blog.csdn.net/weixin_52132159">https://blog.csdn.net/weixin_52132159</a></p>
( O$ @, ^1 B0 J! V) n' B& ]- S! A" @$ J% ^3 K
回复

使用道具 举报

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

本版积分规则

手机版|飞雪团队

GMT+8, 2026-11-4 15:58 , Processed in 0.072205 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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