Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
wxBot
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
wxBot
Commits
0d1712ed
Commit
0d1712ed
authored
Jul 22, 2017
by
fangzhipeng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
提交源代码
parent
ba8d8d1c
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
1085 additions
and
0 deletions
+1085
-0
mvnw
mvnw
+225
-0
mvnw.cmd
mvnw.cmd
+143
-0
pom.xml
pom.xml
+81
-0
result.png
result.png
+0
-0
src/main/java/com/yg84/Login.java
src/main/java/com/yg84/Login.java
+23
-0
src/main/java/com/yg84/WeixinApplication.java
src/main/java/com/yg84/WeixinApplication.java
+19
-0
src/main/java/com/yg84/weixin/Contact.java
src/main/java/com/yg84/weixin/Contact.java
+38
-0
src/main/java/com/yg84/weixin/DefaultMessageHandler.java
src/main/java/com/yg84/weixin/DefaultMessageHandler.java
+31
-0
src/main/java/com/yg84/weixin/MatrixToImageWriter.java
src/main/java/com/yg84/weixin/MatrixToImageWriter.java
+46
-0
src/main/java/com/yg84/weixin/Message.java
src/main/java/com/yg84/weixin/Message.java
+26
-0
src/main/java/com/yg84/weixin/MessageHandler.java
src/main/java/com/yg84/weixin/MessageHandler.java
+12
-0
src/main/java/com/yg84/weixin/MyAcount.java
src/main/java/com/yg84/weixin/MyAcount.java
+26
-0
src/main/java/com/yg84/weixin/MyCookieStore.java
src/main/java/com/yg84/weixin/MyCookieStore.java
+62
-0
src/main/java/com/yg84/weixin/WeChat.java
src/main/java/com/yg84/weixin/WeChat.java
+335
-0
src/main/resources/application.properties
src/main/resources/application.properties
+2
-0
src/test/java/com/yg84/WeixinApplicationTests.java
src/test/java/com/yg84/WeixinApplicationTests.java
+16
-0
No files found.
mvnw
0 → 100755
View file @
0d1712ed
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven2 Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if
[
-z
"
$MAVEN_SKIP_RC
"
]
;
then
if
[
-f
/etc/mavenrc
]
;
then
.
/etc/mavenrc
fi
if
[
-f
"
$HOME
/.mavenrc"
]
;
then
.
"
$HOME
/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin
=
false
;
darwin
=
false
;
mingw
=
false
case
"
`
uname
`
"
in
CYGWIN
*
)
cygwin
=
true
;;
MINGW
*
)
mingw
=
true
;;
Darwin
*
)
darwin
=
true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if
[
-z
"
$JAVA_HOME
"
]
;
then
if
[
-x
"/usr/libexec/java_home"
]
;
then
export
JAVA_HOME
=
"
`
/usr/libexec/java_home
`
"
else
export
JAVA_HOME
=
"/Library/Java/Home"
fi
fi
;;
esac
if
[
-z
"
$JAVA_HOME
"
]
;
then
if
[
-r
/etc/gentoo-release
]
;
then
JAVA_HOME
=
`
java-config
--jre-home
`
fi
fi
if
[
-z
"
$M2_HOME
"
]
;
then
## resolve links - $0 may be a link to maven's home
PRG
=
"
$0
"
# need this for relative symlinks
while
[
-h
"
$PRG
"
]
;
do
ls
=
`
ls
-ld
"
$PRG
"
`
link
=
`
expr
"
$ls
"
:
'.*-> \(.*\)$'
`
if
expr
"
$link
"
:
'/.*'
>
/dev/null
;
then
PRG
=
"
$link
"
else
PRG
=
"
`
dirname
"
$PRG
"
`
/
$link
"
fi
done
saveddir
=
`
pwd
`
M2_HOME
=
`
dirname
"
$PRG
"
`
/..
# make it fully qualified
M2_HOME
=
`
cd
"
$M2_HOME
"
&&
pwd
`
cd
"
$saveddir
"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if
$cygwin
;
then
[
-n
"
$M2_HOME
"
]
&&
M2_HOME
=
`
cygpath
--unix
"
$M2_HOME
"
`
[
-n
"
$JAVA_HOME
"
]
&&
JAVA_HOME
=
`
cygpath
--unix
"
$JAVA_HOME
"
`
[
-n
"
$CLASSPATH
"
]
&&
CLASSPATH
=
`
cygpath
--path
--unix
"
$CLASSPATH
"
`
fi
# For Migwn, ensure paths are in UNIX format before anything is touched
if
$mingw
;
then
[
-n
"
$M2_HOME
"
]
&&
M2_HOME
=
"
`
(
cd
"
$M2_HOME
"
;
pwd
)
`
"
[
-n
"
$JAVA_HOME
"
]
&&
JAVA_HOME
=
"
`
(
cd
"
$JAVA_HOME
"
;
pwd
)
`
"
# TODO classpath?
fi
if
[
-z
"
$JAVA_HOME
"
]
;
then
javaExecutable
=
"
`
which javac
`
"
if
[
-n
"
$javaExecutable
"
]
&&
!
[
"
`
expr
\"
$javaExecutable
\"
:
'\([^ ]*\)'
`
"
=
"no"
]
;
then
# readlink(1) is not available as standard on Solaris 10.
readLink
=
`
which
readlink
`
if
[
!
`
expr
"
$readLink
"
:
'\([^ ]*\)'
`
=
"no"
]
;
then
if
$darwin
;
then
javaHome
=
"
`
dirname
\"
$javaExecutable
\"
`
"
javaExecutable
=
"
`
cd
\"
$javaHome
\"
&&
pwd
-P
`
/javac"
else
javaExecutable
=
"
`
readlink
-f
\"
$javaExecutable
\"
`
"
fi
javaHome
=
"
`
dirname
\"
$javaExecutable
\"
`
"
javaHome
=
`
expr
"
$javaHome
"
:
'\(.*\)/bin'
`
JAVA_HOME
=
"
$javaHome
"
export
JAVA_HOME
fi
fi
fi
if
[
-z
"
$JAVACMD
"
]
;
then
if
[
-n
"
$JAVA_HOME
"
]
;
then
if
[
-x
"
$JAVA_HOME
/jre/sh/java"
]
;
then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD
=
"
$JAVA_HOME
/jre/sh/java"
else
JAVACMD
=
"
$JAVA_HOME
/bin/java"
fi
else
JAVACMD
=
"
`
which java
`
"
fi
fi
if
[
!
-x
"
$JAVACMD
"
]
;
then
echo
"Error: JAVA_HOME is not defined correctly."
>
&2
echo
" We cannot execute
$JAVACMD
"
>
&2
exit
1
fi
if
[
-z
"
$JAVA_HOME
"
]
;
then
echo
"Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER
=
org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir
()
{
if
[
-z
"
$1
"
]
then
echo
"Path not specified to find_maven_basedir"
return
1
fi
basedir
=
"
$1
"
wdir
=
"
$1
"
while
[
"
$wdir
"
!=
'/'
]
;
do
if
[
-d
"
$wdir
"
/.mvn
]
;
then
basedir
=
$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if
[
-d
"
${
wdir
}
"
]
;
then
wdir
=
`
cd
"
$wdir
/.."
;
pwd
`
fi
# end of workaround
done
echo
"
${
basedir
}
"
}
# concatenates all lines of a file
concat_lines
()
{
if
[
-f
"
$1
"
]
;
then
echo
"
$(
tr
-s
'\n'
' '
<
"
$1
"
)
"
fi
}
BASE_DIR
=
`
find_maven_basedir
"
$(
pwd
)
"
`
if
[
-z
"
$BASE_DIR
"
]
;
then
exit
1
;
fi
export
MAVEN_PROJECTBASEDIR
=
${
MAVEN_BASEDIR
:-
"
$BASE_DIR
"
}
echo
$MAVEN_PROJECTBASEDIR
MAVEN_OPTS
=
"
$(
concat_lines
"
$MAVEN_PROJECTBASEDIR
/.mvn/jvm.config"
)
$MAVEN_OPTS
"
# For Cygwin, switch paths to Windows format before running java
if
$cygwin
;
then
[
-n
"
$M2_HOME
"
]
&&
M2_HOME
=
`
cygpath
--path
--windows
"
$M2_HOME
"
`
[
-n
"
$JAVA_HOME
"
]
&&
JAVA_HOME
=
`
cygpath
--path
--windows
"
$JAVA_HOME
"
`
[
-n
"
$CLASSPATH
"
]
&&
CLASSPATH
=
`
cygpath
--path
--windows
"
$CLASSPATH
"
`
[
-n
"
$MAVEN_PROJECTBASEDIR
"
]
&&
MAVEN_PROJECTBASEDIR
=
`
cygpath
--path
--windows
"
$MAVEN_PROJECTBASEDIR
"
`
fi
WRAPPER_LAUNCHER
=
org.apache.maven.wrapper.MavenWrapperMain
exec
"
$JAVACMD
"
\
$MAVEN_OPTS
\
-classpath
"
$MAVEN_PROJECTBASEDIR
/.mvn/wrapper/maven-wrapper.jar"
\
"-Dmaven.home=
${
M2_HOME
}
"
"-Dmaven.multiModuleProjectDirectory=
${
MAVEN_PROJECTBASEDIR
}
"
\
${
WRAPPER_LAUNCHER
}
$MAVEN_CONFIG
"
$@
"
mvnw.cmd
0 → 100644
View file @
0d1712ed
@REM
----------------------------------------------------------------------------
@REM
Licensed
to
the
Apache
Software
Foundation
(
ASF
)
under
one
@REM
or
more
contributor
license
agreements
.
See
the
NOTICE
file
@REM
distributed
with
this
work
for
additional
information
@REM
regarding
copyright
ownership
.
The
ASF
licenses
this
file
@REM
to
you
under
the
Apache
License
,
Version
2
.0
(
the
@REM
"License"
);
you
may
not
use
this
file
except
in
compliance
@REM
with
the
License
.
You
may
obtain
a
copy
of
the
License
at
@REM
@REM
http
://www.apache.org/licenses/LICENSE
-
2
.0
@REM
@REM
Unless
required
by
applicable
law
or
agreed
to
in
writing
,
@REM
software
distributed
under
the
License
is
distributed
on
an
@REM
"AS IS"
BASIS
,
WITHOUT
WARRANTIES
OR
CONDITIONS
OF
ANY
@REM
KIND
,
either
express
or
implied
.
See
the
License
for
the
@REM
specific
language
governing
permissions
and
limitations
@REM
under
the
License
.
@REM
----------------------------------------------------------------------------
@REM
----------------------------------------------------------------------------
@REM
Maven2
Start
Up
Batch
script
@REM
@REM
Required
ENV
vars
:
@REM
JAVA_HOME
-
location
of
a
JDK
home
dir
@REM
@REM
Optional
ENV
vars
@REM
M2_HOME
-
location
of
maven2
's installed home dir
@REM MAVEN_BATCH_ECHO - set to '
on
' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to '
on
' to wait for a key stroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '
@
' in case MAVEN_BATCH_ECHO is '
on
'
@echo off
@REM enable echoing my setting MAVEN_BATCH_ECHO to '
on
'
@if "
%MAVEN_BATCH_ECHO%
" == "on" echo
%MAVEN_BATCH_ECHO%
@REM set
%HOME%
to equivalent of $HOME
if "
%HOME%
" == "" (set "HOME=
%HOMEDRIVE%%
HOMEPATH
%
")
@REM Execute a user defined script before this one
if not "
%MAVEN_SKIP_RC%
" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "
%HOME%
\mavenrc_pre.bat" call "
%HOME%
\mavenrc_pre.bat"
if exist "
%HOME%
\mavenrc_pre.cmd" call "
%HOME%
\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "
%JAVA_HOME%
" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "
%JAVA_HOME%
\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "
%JAVA_HOME%
" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=
%MAVEN_BASEDIR%
IF NOT "
%MAVEN_PROJECTBASEDIR%
"=="" goto endDetectBaseDir
set EXEC_DIR=
%CD%
set WDIR=
%EXEC_DIR%
:findBaseDir
IF EXIST "
%WDIR%
"\.mvn goto baseDirFound
cd ..
IF "
%WDIR%
"=="
%CD%
" goto baseDirNotFound
set WDIR=
%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=
%WDIR%
cd "
%EXEC_DIR%
"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=
%EXEC_DIR%
cd "
%EXEC_DIR%
"
:endDetectBaseDir
IF NOT EXIST "
%MAVEN_PROJECTBASEDIR%
\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims="
%%a
in ("
%MAVEN_PROJECTBASEDIR%
\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=
!JVM_CONFIG_MAVEN_PROPS!
%%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=
%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="
%JAVA_HOME%
\bin\java.exe"
set WRAPPER_JAR="
%MAVEN_PROJECTBASEDIR%
\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
%MAVEN_JAVA_EXE%
%JVM_CONFIG_MAVEN_PROPS%
%MAVEN_OPTS%
%MAVEN_DEBUG_OPTS%
-classpath
%WRAPPER_JAR%
"-Dmaven.multiModuleProjectDirectory=
%MAVEN_PROJECTBASEDIR%
"
%WRAPPER_LAUNCHER%
%MAVEN_CONFIG%
%
*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=
%ERROR_CODE%
if not "
%MAVEN_SKIP_RC%
" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "
%HOME%
\mavenrc_post.bat" call "
%HOME%
\mavenrc_post.bat"
if exist "
%HOME%
\mavenrc_post.cmd" call "
%HOME%
\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to '
on
'
if "
%MAVEN_BATCH_PAUSE%
" == "on" pause
if "
%MAVEN_TERMINATE_CMD%
" == "on" exit
%ERROR_CODE%
exit /B
%ERROR_CODE%
pom.xml
0 → 100644
View file @
0d1712ed
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
com.yg84
</groupId>
<artifactId>
weixin
</artifactId>
<version>
0.0.1-SNAPSHOT
</version>
<packaging>
jar
</packaging>
<name>
weixin
</name>
<description>
Demo project for Spring Boot
</description>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
1.5.4.RELEASE
</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<project.reporting.outputEncoding>
UTF-8
</project.reporting.outputEncoding>
<java.version>
1.8
</java.version>
</properties>
<dependencies>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-devtools
</artifactId>
<scope>
runtime
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp/okhttp -->
<dependency>
<groupId>
com.squareup.okhttp
</groupId>
<artifactId>
okhttp
</artifactId>
<version>
2.7.5
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.35
</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>
com.google.zxing
</groupId>
<artifactId>
core
</artifactId>
<version>
3.3.0
</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
<configuration>
<includeSystemScope>
true
</includeSystemScope>
<!--<fork>true</fork>-->
</configuration>
</plugin>
</plugins>
</build>
</project>
result.png
0 → 100644
View file @
0d1712ed
1.49 KB
src/main/java/com/yg84/Login.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
;
import
com.squareup.okhttp.OkHttpClient
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
/**
* Created by fangzhipeng on 2017/7/16.
*/
@RestController
public
class
Login
{
@RequestMapping
(
value
=
"/login"
)
public
String
login
()
throws
Exception
{
return
WeixinApplication
.
weChat
.
run
();
}
@RequestMapping
(
value
=
"/sendMsg"
)
public
String
sendMsg
(
String
name
,
String
content
)
throws
Exception
{
return
WeixinApplication
.
weChat
.
sendMsg
(
name
,
content
);
}
}
src/main/java/com/yg84/WeixinApplication.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
;
import
com.yg84.weixin.WeChat
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
@EnableAutoConfiguration
@SpringBootApplication
public
class
WeixinApplication
{
public
static
WeChat
weChat
=
new
WeChat
(
null
);
public
static
void
main
(
String
[]
args
)
{
System
.
setProperty
(
"jsse.enableSNIExtension"
,
"false"
);
SpringApplication
.
run
(
WeixinApplication
.
class
,
args
);
}
}
src/main/java/com/yg84/weixin/Contact.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
import
com.alibaba.fastjson.JSONObject
;
import
javax.sound.midi.Soundbank
;
/**
* Created by fangzhipeng on 2017/7/22.
*/
public
class
Contact
{
private
String
userName
;
private
String
nickName
;
private
String
remarkName
;
public
String
getUserName
()
{
return
userName
;
}
public
void
setUserName
(
String
userName
)
{
this
.
userName
=
userName
;
}
public
String
getNickName
()
{
return
nickName
;
}
public
void
setNickName
(
String
nickName
)
{
this
.
nickName
=
nickName
;
}
public
String
getRemarkName
()
{
return
remarkName
;
}
public
void
setRemarkName
(
String
remarkName
)
{
this
.
remarkName
=
remarkName
;
}
}
src/main/java/com/yg84/weixin/DefaultMessageHandler.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* Created by fangzhipeng on 2017/7/22.
*/
public
class
DefaultMessageHandler
implements
MessageHandler
{
private
WeChat
weChat
;
public
DefaultMessageHandler
(
WeChat
weChat
)
{
this
.
weChat
=
weChat
;
}
@Override
public
void
handleMsg
(
List
<
Message
>
messages
)
throws
Exception
{
List
<
Contact
>
contacts
=
weChat
.
getContacts
();
Map
<
String
,
Contact
>
contactByUserName
=
new
HashMap
<>();
for
(
Contact
contact
:
contacts
)
{
contactByUserName
.
put
(
contact
.
getUserName
(),
contact
);
}
for
(
Message
message
:
messages
)
{
Contact
contact
=
contactByUserName
.
get
(
message
.
getFromUserName
());
System
.
out
.
println
(
contact
.
getNickName
()
+
"发来消息:"
+
message
.
getContent
());
}
}
}
src/main/java/com/yg84/weixin/MatrixToImageWriter.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
import
com.google.zxing.common.BitMatrix
;
import
javax.imageio.ImageIO
;
import
java.awt.image.BufferedImage
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.OutputStream
;
/**
* Created by fangzhipeng on 2017/7/20.
*/
public
class
MatrixToImageWriter
{
private
static
final
int
BLACK
=
0xFF000000
;
private
static
final
int
WHITE
=
0xFFFFFFFF
;
private
MatrixToImageWriter
()
{
}
public
static
BufferedImage
toBufferedImage
(
BitMatrix
matrix
)
{
int
width
=
matrix
.
getWidth
();
int
height
=
matrix
.
getHeight
();
BufferedImage
image
=
new
BufferedImage
(
width
,
height
,
BufferedImage
.
TYPE_INT_RGB
);
for
(
int
x
=
0
;
x
<
width
;
x
++)
{
for
(
int
y
=
0
;
y
<
height
;
y
++)
{
image
.
setRGB
(
x
,
y
,
matrix
.
get
(
x
,
y
)
?
BLACK
:
WHITE
);
}
}
return
image
;
}
public
static
void
writeToFile
(
BitMatrix
matrix
,
String
format
,
File
file
)
throws
IOException
{
BufferedImage
image
=
toBufferedImage
(
matrix
);
if
(!
ImageIO
.
write
(
image
,
format
,
file
))
{
throw
new
IOException
(
"Could not write an image of format "
+
format
+
" to "
+
file
);
}
}
public
static
void
writeToStream
(
BitMatrix
matrix
,
String
format
,
OutputStream
stream
)
throws
IOException
{
BufferedImage
image
=
toBufferedImage
(
matrix
);
if
(!
ImageIO
.
write
(
image
,
format
,
stream
))
{
throw
new
IOException
(
"Could not write an image of format "
+
format
);
}
}
}
src/main/java/com/yg84/weixin/Message.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
/**
* Created by fangzhipeng on 2017/7/22.
*/
public
class
Message
{
private
String
fromUserName
;
private
String
content
;
public
String
getFromUserName
()
{
return
fromUserName
;
}
public
void
setFromUserName
(
String
fromUserName
)
{
this
.
fromUserName
=
fromUserName
;
}
public
String
getContent
()
{
return
content
;
}
public
void
setContent
(
String
content
)
{
this
.
content
=
content
;
}
}
src/main/java/com/yg84/weixin/MessageHandler.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
import
java.util.List
;
/**
* Created by fangzhipeng on 2017/7/22.
*/
public
interface
MessageHandler
{
public
void
handleMsg
(
List
<
Message
>
messages
)
throws
Exception
;
}
src/main/java/com/yg84/weixin/MyAcount.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
/**
* Created by fangzhipeng on 2017/7/22.
*/
public
class
MyAcount
{
private
String
userName
;
private
String
nickName
;
public
String
getUserName
()
{
return
userName
;
}
public
void
setUserName
(
String
userName
)
{
this
.
userName
=
userName
;
}
public
String
getNickName
()
{
return
nickName
;
}
public
void
setNickName
(
String
nickName
)
{
this
.
nickName
=
nickName
;
}
}
src/main/java/com/yg84/weixin/MyCookieStore.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
import
java.net.CookieStore
;
import
java.net.HttpCookie
;
import
java.net.URI
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* Created by fangzhipeng on 2017/7/16.
*/
public
class
MyCookieStore
implements
CookieStore
{
private
Map
<
URI
,
List
<
HttpCookie
>>
cookieMap
=
new
HashMap
<>();
@Override
public
void
add
(
URI
uri
,
HttpCookie
cookie
)
{
if
(!
cookieMap
.
containsKey
(
uri
))
{
cookieMap
.
put
(
uri
,
new
ArrayList
<>());
}
cookieMap
.
get
(
uri
).
add
(
cookie
);
}
@Override
public
List
<
HttpCookie
>
get
(
URI
uri
)
{
List
<
HttpCookie
>
list
=
new
ArrayList
<>();
cookieMap
.
values
().
forEach
(
list:
:
addAll
);
return
list
;
}
@Override
public
List
<
HttpCookie
>
getCookies
()
{
List
<
HttpCookie
>
ret
=
new
ArrayList
<>();
for
(
List
<
HttpCookie
>
value
:
cookieMap
.
values
())
{
ret
.
addAll
(
value
);
}
return
ret
;
}
@Override
public
List
<
URI
>
getURIs
()
{
List
<
URI
>
ret
=
new
ArrayList
<>();
for
(
URI
uri
:
cookieMap
.
keySet
())
{
ret
.
add
(
uri
);
}
return
ret
;
}
@Override
public
boolean
remove
(
URI
uri
,
HttpCookie
cookie
)
{
cookieMap
.
get
(
uri
).
remove
(
cookie
);
return
true
;
}
@Override
public
boolean
removeAll
()
{
cookieMap
.
clear
();
return
true
;
}
}
src/main/java/com/yg84/weixin/WeChat.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
.
weixin
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.google.zxing.BarcodeFormat
;
import
com.google.zxing.EncodeHintType
;
import
com.google.zxing.MultiFormatWriter
;
import
com.google.zxing.common.BitMatrix
;
import
com.squareup.okhttp.*
;
import
java.io.File
;
import
java.net.CookieManager
;
import
java.net.CookiePolicy
;
import
java.sql.Timestamp
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.util.concurrent.TimeUnit
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* Created by fangzhipeng on 2017/7/18.
*/
public
class
WeChat
{
private
OkHttpClient
client
=
new
OkHttpClient
();
private
final
String
ID_URL
=
"https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&fun=new&lang=zh_CN&_="
;
private
final
String
QR_CODE_URL
=
"https://login.weixin.qq.com/l/%s"
;
//https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s
private
final
String
QUERY_LOGIN_URL
=
"https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=%s&tip=1&_=%s"
;
//https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AZIGwFAhLwYpsl2Vb58f8a_d@qrticket_0&uuid=AajL59ccVA==&lang=zh_CN&scan=1500473302&fun=new
//https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AWa4aLOGudDEUnKxXhPGBnVf@qrticket_0&uuid=4eS6FygDDQ==&lang=zh_CN&scan=1500475502
private
String
redirect_uri
;
private
String
wxuin
;
private
String
wxsid
;
private
String
skey
;
private
String
pass_ticket
;
//https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1500478285139&lang=en_US&pass_ticket=IUFOH%2Bn9wawwnZY6rzs9DvU1Sw54raR2jlTBgMJ0FP8tfHnjz4hvub%2BbbJNeME8S
private
final
String
INIT_URL
=
"https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=%s&lang=en_US&pass_ticket=%s&skey=%s"
;
private
String
DeviceID
=
"e"
+
(
Math
.
random
()
+
""
).
substring
(
2
,
17
);
//{'Sid': u'M0/Hekc0nWmeat7S', 'Skey': u'@crypt_943e81a7_e645694e088200eb35cec07d006de359', 'DeviceID': 'e110437471594597', 'Uin': u'1219744940'}
private
String
INIT_JSON
=
"{\"BaseRequest\":{\"Sid\": \"%s\", \"Skey\": \"%s\", \"DeviceID\": \"%s\", \"Uin\": \"%s\"}}"
;
private
static
final
MediaType
JSON
=
MediaType
.
parse
(
"application/json; charset=utf-8"
);
private
String
PERSON_URL
=
"https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r="
;
private
MyAcount
myAcount
;
private
List
<
Contact
>
contacts
;
private
Map
<
String
,
Contact
>
contactByUserName
;
private
JSONArray
member
;
private
JSONObject
MY_ACOUNT
;
private
JSONObject
SyncKeyObject
;
private
String
SyncKey
=
""
;
private
String
SYNC_URL
=
"https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?"
;
private
Timer
SYNC_TIMER
=
new
Timer
();
private
String
GET_MSG_URL
=
"https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?"
;
private
String
SEND_MSG_URL
=
"https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=%s"
;
private
MessageHandler
handler
;
public
WeChat
(
MessageHandler
handler
)
{
if
(
handler
==
null
)
this
.
handler
=
new
DefaultMessageHandler
(
this
);
else
this
.
handler
=
handler
;
MyCookieStore
cookieStore
=
new
MyCookieStore
();
client
.
setCookieHandler
(
new
CookieManager
(
cookieStore
,
CookiePolicy
.
ACCEPT_ALL
));
client
.
setReadTimeout
(
2
,
TimeUnit
.
MINUTES
);
}
public
String
run
()
throws
Exception
{
login
();
init
();
return
"启动成功!"
;
}
public
List
<
Contact
>
getContacts
()
{
return
contacts
;
}
public
String
sendMsg
(
String
name
,
String
content
)
throws
Exception
{
Contact
target
=
null
;
for
(
Contact
contact
:
contacts
)
{
if
(
name
.
equals
(
contact
.
getNickName
())
||
name
.
equals
(
contact
.
getRemarkName
()))
{
target
=
contact
;
break
;
}
}
if
(
target
!=
null
)
{
sendMsg
(
content
,
myAcount
.
getUserName
(),
target
.
getUserName
());
return
"发送成功!"
;
}
else
{
return
"没有找到对应的联系人!"
;
}
}
public
String
sendMsg
(
String
content
,
String
fromUserName
,
String
toUserName
)
throws
Exception
{
String
msgId
=
(
getTimestamp
()
*
1000
)
+
((
Math
.
random
()
+
""
).
substring
(
0
,
5
).
replace
(
"."
,
""
));
String
paramTemplate
=
"{\"Msg\": {\"FromUserName\": \"%s\", \"LocalID\": \"%s\", \"Type\": 1, \"ToUserName\": \"%s\", \"Content\": \"%s\", \"ClientMsgId\": \"%S\"}, \"BaseRequest\": {\"Sid\": \"%s\", \"Skey\": \"%s\", \"DeviceID\": \"%s\", \"Uin\": %s}}"
;
String
json
=
String
.
format
(
paramTemplate
,
fromUserName
,
msgId
,
toUserName
,
content
,
msgId
,
wxsid
,
skey
,
DeviceID
,
wxuin
);
String
url
=
String
.
format
(
SEND_MSG_URL
,
pass_ticket
);
Response
response
=
postJson
(
url
,
json
);
if
(!
response
.
isSuccessful
())
return
"发送失败!"
;
return
"发送成功!"
;
}
private
String
login
()
throws
Exception
{
String
url
=
ID_URL
+
getTimestamp
();
Response
response
=
get
(
url
);
if
(!
response
.
isSuccessful
())
return
"登录异常!"
;
String
uuid
=
getUUID
(
response
.
body
().
string
());
genQRCode
(
uuid
);
while
(
true
)
{
url
=
String
.
format
(
QUERY_LOGIN_URL
,
uuid
,
getTimestamp
());
response
=
get
(
url
);
if
(!
response
.
isSuccessful
())
return
"登录异常!"
;
String
msg
=
response
.
body
().
string
();
System
.
out
.
println
(
msg
);
if
(
getRedirect_uri
(
msg
))
{
break
;
}
Thread
.
sleep
(
500
);
}
url
=
redirect_uri
;
response
=
get
(
url
);
if
(!
response
.
isSuccessful
())
return
"登录失败!"
;
String
msg
=
response
.
body
().
string
();
if
(!
parseMsg
(
msg
))
return
"登录失败!"
;
return
"登录成功!"
;
}
private
String
init
()
throws
Exception
{
String
url
=
String
.
format
(
INIT_URL
,
getTimestamp
(),
pass_ticket
,
skey
);
String
json
=
String
.
format
(
INIT_JSON
,
wxsid
,
skey
,
DeviceID
,
wxuin
);
Response
response
=
postJson
(
url
,
json
);
if
(!
response
.
isSuccessful
())
return
"微信初始化失败!"
;
String
msg
=
response
.
body
().
string
();
JSONObject
msgObject
=
JSONObject
.
parseObject
(
msg
);
initMyAcount
(
msgObject
);
initSyncKey
(
msgObject
);
initContact
();
initTimer
();
return
"微信初始化成功!"
;
}
private
String
sync
()
throws
Exception
{
String
params
=
"r=%s&sid=%s&uin=%s&skey=%s&deviceid=%s&synckey=%s&_=%s"
;
String
url
=
SYNC_URL
+
String
.
format
(
params
,
getTimestamp
(),
wxsid
,
wxuin
,
skey
,
DeviceID
,
SyncKey
,
getTimestamp
());
Response
response
=
get
(
url
);
if
(!
response
.
isSuccessful
())
return
"同步失败!"
;
String
msg
=
response
.
body
().
string
();
Pattern
pattern
=
Pattern
.
compile
(
"retcode:\"(.*)\",selector:\"(.*)\""
);
Matcher
m
=
pattern
.
matcher
(
msg
);
m
.
find
();
if
(
"2"
.
equals
(
m
.
group
(
2
)))
{
receiveMsg
();
}
return
"同步成功!"
;
}
private
String
receiveMsg
()
throws
Exception
{
String
params
=
"sid=%s&skey=%s&lang=en_US&pass_ticket=%s"
;
String
postMsg
=
"{\"BaseRequest\" : {\"Uin\":%s,\"Sid\":\"%s\"},\"SyncKey\" : %s,\"rr\" :%s}"
;
String
url
=
GET_MSG_URL
+
String
.
format
(
params
,
wxsid
,
skey
,
pass_ticket
);
String
json
=
String
.
format
(
postMsg
,
wxuin
,
wxsid
,
SyncKeyObject
.
toJSONString
(),
getTimestamp
());
Response
response
=
postJson
(
url
,
json
);
if
(!
response
.
isSuccessful
())
return
"接收消息失败!"
;
String
msg
=
response
.
body
().
string
();
JSONObject
msgObject
=
JSONObject
.
parseObject
(
msg
);
if
(
0
==
msgObject
.
getJSONObject
(
"BaseResponse"
).
getInteger
(
"Ret"
))
{
List
<
Message
>
messages
=
JSONObject
.
parseArray
(
msgObject
.
getString
(
"AddMsgList"
),
Message
.
class
);
handler
.
handleMsg
(
messages
);
SyncKeyObject
=
msgObject
.
getJSONObject
(
"SyncCheckKey"
);
genSyncKey
();
}
return
"消息处理成功!"
;
}
private
Response
get
(
String
url
)
throws
Exception
{
Request
request
=
genBuilder
().
url
(
url
).
build
();
return
client
.
newCall
(
request
).
execute
();
}
private
Response
postJson
(
String
url
,
String
json
)
throws
Exception
{
Request
request
=
genBuilder
().
url
(
url
).
post
(
RequestBody
.
create
(
JSON
,
json
)).
build
();
return
client
.
newCall
(
request
).
execute
();
}
private
String
getUUID
(
String
str
)
{
String
uuid
=
str
.
substring
(
str
.
indexOf
(
"\""
)
+
1
,
str
.
lastIndexOf
(
"\""
));
return
uuid
;
}
private
Request
.
Builder
genBuilder
()
{
return
new
Request
.
Builder
().
header
(
"User-Agent"
,
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
);
}
private
boolean
getRedirect_uri
(
String
str
)
{
if
(
str
.
indexOf
(
"window.redirect_uri="
)
!=
-
1
)
{
redirect_uri
=
str
.
substring
(
str
.
indexOf
(
"\""
)
+
1
,
str
.
lastIndexOf
(
"\""
))
+
"&fun=new"
;
return
true
;
}
return
false
;
}
long
getTimestamp
()
{
return
Timestamp
.
valueOf
(
LocalDateTime
.
now
()).
getTime
();
}
private
void
genQRCode
(
String
uuid
)
throws
Exception
{
String
text
=
String
.
format
(
QR_CODE_URL
,
uuid
);
// 二维码内容
int
width
=
300
;
// 二维码图片宽度
int
height
=
300
;
// 二维码图片高度
String
format
=
"png"
;
// 二维码的图片格式
Hashtable
<
EncodeHintType
,
String
>
hints
=
new
Hashtable
<
EncodeHintType
,
String
>();
hints
.
put
(
EncodeHintType
.
CHARACTER_SET
,
"utf-8"
);
// 内容所使用字符集编码
BitMatrix
bitMatrix
=
new
MultiFormatWriter
().
encode
(
text
,
BarcodeFormat
.
QR_CODE
,
width
,
height
,
hints
);
// 生成二维码
File
outputFile
=
new
File
(
"./result.png"
);
MatrixToImageWriter
.
writeToFile
(
bitMatrix
,
format
,
outputFile
);
Runtime
run
=
Runtime
.
getRuntime
();
run
.
exec
(
"open "
+
outputFile
.
getAbsolutePath
());
}
private
void
genSyncKey
()
{
SyncKey
=
""
;
JSONArray
array
=
SyncKeyObject
.
getJSONArray
(
"List"
);
for
(
int
i
=
0
;
i
<
array
.
size
();
i
++)
{
JSONObject
item
=
array
.
getJSONObject
(
i
);
String
key
=
item
.
getString
(
"Key"
);
String
value
=
item
.
getString
(
"Val"
);
SyncKey
+=
"|"
+
key
+
"_"
+
value
;
}
SyncKey
=
SyncKey
.
substring
(
1
);
}
private
boolean
parseMsg
(
String
msg
)
{
Pattern
pattern
=
Pattern
.
compile
(
"<skey>(.*)</skey><wxsid>(.*)</wxsid><wxuin>(.*)</wxuin><pass_ticket>(.*)</pass_ticket>"
);
Matcher
m
=
pattern
.
matcher
(
msg
);
if
(!
m
.
find
())
return
false
;
skey
=
m
.
group
(
1
);
wxsid
=
m
.
group
(
2
);
wxuin
=
m
.
group
(
3
);
pass_ticket
=
m
.
group
(
4
);
return
true
;
}
private
void
initTimer
()
{
SYNC_TIMER
.
schedule
(
new
TimerTask
()
{
@Override
public
void
run
()
{
try
{
sync
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
},
1000
,
2000
);
}
private
void
initMyAcount
(
JSONObject
msgObject
)
{
MY_ACOUNT
=
msgObject
.
getJSONObject
(
"User"
);
myAcount
=
JSONObject
.
parseObject
(
MY_ACOUNT
.
toJSONString
(),
MyAcount
.
class
);
}
private
void
initSyncKey
(
JSONObject
msgObject
)
{
SyncKeyObject
=
msgObject
.
getJSONObject
(
"SyncKey"
);
SyncKey
=
""
;
genSyncKey
();
}
private
String
initContact
()
throws
Exception
{
String
url
=
PERSON_URL
+
getTimestamp
();
String
json
=
"{}"
;
Response
response
=
postJson
(
url
,
json
);
if
(!
response
.
isSuccessful
())
return
"获取朋友列表失败!"
;
String
msg
=
response
.
body
().
string
();
member
=
JSONObject
.
parseObject
(
msg
).
getJSONArray
(
"MemberList"
);
contacts
=
JSONObject
.
parseArray
(
JSONObject
.
parseObject
(
msg
).
getString
(
"MemberList"
),
Contact
.
class
);
contactByUserName
=
new
HashMap
<>();
contacts
.
forEach
(
contact
->
{
contactByUserName
.
put
(
contact
.
getUserName
(),
contact
);
});
return
"获取朋友列表成功!"
;
}
public
static
void
main
(
String
[]
args
)
{
String
msg
=
"window.synccheck={retcode:\"0\",selector:\"2\"}"
;
Pattern
pattern
=
Pattern
.
compile
(
"retcode:\"(.*)\",selector:\"(.*)\""
);
Matcher
m
=
pattern
.
matcher
(
msg
);
System
.
out
.
println
(
m
.
find
());
}
}
src/main/resources/application.properties
0 → 100644
View file @
0d1712ed
server.port
=
9999
server.tomcat.uri-encoding
=
utf-8
\ No newline at end of file
src/test/java/com/yg84/WeixinApplicationTests.java
0 → 100644
View file @
0d1712ed
package
com
.
yg84
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.test.context.junit4.SpringRunner
;
@RunWith
(
SpringRunner
.
class
)
@SpringBootTest
public
class
WeixinApplicationTests
{
@Test
public
void
contextLoads
()
{
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment